Codeforces Round #779 (Div. 2)
A
题目大意
给一个01串,其中每一个长度大于等于2的子区间中0的数量不大于1的数量,最少插入多少1
思路
寻找 00 和 010
00 -->0110 加2
010 -->0110 加1
代码
#include <bits/stdc++.h> using namespace std; int t; int main() { std::ios::sync_with_stdio(false); cin >> t; while (t--) { int n; cin >> n; string s; cin >> s; if (n == 1) { cout << "0" << endl; continue; } int z = 0; for (int i = 0; i < n; i++) { if (s[i] == '0') z++; } if (z == 0 || z == 1 && n >= 2) { cout << "0" << endl; continue; } int ans = 0; for (int i = 0; i < n; i++) { if (s[i] == '0') { for (int j = i + 1; j < n; j++) { if (s[j] == '0') { if (j - i == 1) ans += 2; else if (j - i == 2) ans += 1; i = j - 1; break; } } } } cout << ans << endl; } return 0; }
小结:
简单的字符串问题,从最小的单元为起点去思考
B
题意
给一个1~n的排列,若满足以下条件则是一个“美丽排列”。
gcd(1*p1,2*p2,...,n*pn) > 1 ( gcd 求所以元素的最大公约数 )
给定一个n,问有多少种美丽排列,模998244353 。
思路
若 n 为奇数则答案为 0
为偶数则让奇偶相乘 有 (n/2)! * (n/2)!
代码
#include <bits/stdc++.h> using namespace std; int mod = 998244353; int main() { int t; cin >> t; while (t--) { long long a = 1; int n; cin >> n; if (n % 2 == 1) { cout << 0 << endl; continue; } for (int i = 1; i <= n / 2; i++) { a = a * i; a = a % mod; } cout << (a * a) % mod << endl; } return 0; }
C
题目大意
这题目题意贼绕
给一个1~n的排列p,根据p做数列b,bi表示p1~pi中的最大值。b数列中不同的数值数量就是排列p的力量。
现在给出数列c,ci表示p向左循环右移i-1位所得到的力量值。问给出的c有没有可能被一种p得到。
思路
观察可知 1 有且只有一个,不符合的可直接判错
通过几组数据模拟可发现,每移动一位 ,下一个力量值最多增加 1 以此判断是否正确
需要注意最后一位也要对第一为进行判断
代码
#include <bits/stdc++.h> typedef long long ll; using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; while (T--) { int n; cin >> n; int s[n+1]; int flag = 0; for (int i = 0; i < n; i++) { cin >> s[i]; if (s[i] == 1) flag++; } s[n]=s[0]; int k = 1; for (int i = 0; i + 1 <= n; i++) if (s[i + 1] - s[i] > 1) { k = 0; break; } if (k == 1 && flag == 1) cout << "YES\n"; else cout << "NO\n"; } return 0; }

浙公网安备 33010602011771号