Codeforces Round 1068 (Div. 2)
A. Sleeping Through Classes
根据题意,定义 res 为还需要休息的天数,初始时为0。枚举一遍字符串 s,如果一节课是重要的,更新 res = k ,若 cnt=0 且该节课不重要, ans++
int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { int n, k; cin >> n >> k; string s; cin >> s; int last = -k - 1; int count = 0; for (int i = 0; i < n; ++i) { if (s[i] == '1') { last = i; } else { if (i > last + k) { count++; } } } cout << count << endl; } return 0; }
B. Niko's Tactical Cards
初始时 k 为0,有两种操作,要么 k-ai,要么 bi-k,要想得到最大值,对于 k-ai,k要尽可能得大,对于 bi-k,k要尽可能得小,遍历数组,每次记录最大值和最小值
max(maxx - a[i], b[i] - minn)
min(minn - a[i], b[i] - maxx)
void solve(){ int n; cin >> n; vector<int> a(n + 1), b(n + 1); for(int i = 1; i <= n; ++i) cin >> a[i]; for(int i = 1; i <= n; ++i) cin >> b[i]; int maxx = 0, minn = 0; for(int i = 1; i <= n; ++i){ int mx = max(maxx - a[i], b[i] - minn); int mi = min(minn - a[i], b[i] - maxx); maxx = mx, minn = mi; } cout << maxx << endl; }
C. Kanade's Perfect Multiples
根据题目,集合B的要求 ai 中至少有一个除数包含在 B 中,bj 中所有小于等于 k 的正倍数在 数组 A中出现。那么集合 B 中,最小的数就是 数组 A 中最小的数。将数组A从小到大排序,记录每个数组A中每个元素标记为 -1,表示集合B不包含该元素,遍历排序后的数组A,当遍历到当前元素的标记为-1时,枚举正倍数,当正倍数在map里的标记为-1时,表示该数在数组A中存在,将它改为1,若遍历到的数map里标记为0时,表示该数在数组A中不存在,违反了规则直接输出-1。若以上条件都满足,则该数就是满足条件的bj,加入集合B,最后输出结果。
void solve(){ unordered_map<int, int> mp; int n, k; cin >> n >> k; vector<int> a(n + 1); for(int i = 1; i <= n; ++i) cin >> a[i], mp[a[i]] = -1; sort(a.begin() + 1, a.end()); vector<int> ans; //vector<int> vis(k + 1, 0); for(int i = 1; i <= n; ++i){ if(mp[a[i]] == -1){ for(int j = a[i]; j <= k; j += a[i]){ if(mp[j] == 1) continue; if(mp[j] == 0){ cout << -1 << endl; return ; } mp[j] = 1; } ans.push_back(a[i]); } } cout << ans.size() << endl; for(auto& x : ans) cout << x << " "; cout << '\n'; }

浙公网安备 33010602011771号