Codeforces Round #521 (Div. 3) CDE
阿新 • • 發佈:2018-11-17
C
問刪掉在陣列中一個數後,剩下的陣列中,是否存在一個數時其它所有數的和。
遍歷每一個數,假設刪掉它後,剩下的數中取一個最大值,看他的值是不是陣列之和的一半,是的話就成立。
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N = 2e5+10; 5 ll a[N], n; 6 vector<ll> v; 7 int main() { 8 cin >> n; 9 ll sum = 0;10 priority_queue<ll> que; 11 for(int i = 1; i <= n; i ++) cin >> a[i], sum += a[i], que.push(a[i]); 12 int ans = 0; 13 // cout << sum << ' ' << que.top() << endl; 14 for(int i = 1; i <= n; i ++) { 15 if(que.top() == a[i]) { 16 que.pop();17 sum -= a[i]; 18 if(sum == que.top()*2) ans++, v.push_back(i); 19 sum += a[i]; 20 que.push(a[i]); 21 } else { 22 sum -= a[i]; 23 if(sum == que.top()*2) ans++, v.push_back(i); 24 sum += a[i]; 25 }26 } 27 printf("%d\n",ans); 28 for(auto x : v) printf("%lld ", x);printf("\n"); 29 return 0; 30 }
D
有一個數組,可以選定一個子集,看最大能刪除多少次,輸出那個子集。
二分,檢查當前最大刪除次數時m時,是否成立。
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N = 2e5+10; 5 int a[N], n, k, x; 6 bool cmp(int x, int y) { return x > y;} 7 bool ok(int m) { 8 int ans = 0; 9 for(int i = 0; i < N; i ++) if(a[i])ans += a[i]/m; 10 return ans >= k; 11 } 12 int main() { 13 cin >> n >> k; 14 for(int i = 1; i <= n; i ++) { 15 cin >> x; 16 a[x]++; 17 } 18 int l = 1, r = n/k, MAX = 0; 19 while (l <= r) { 20 int m = (l+r) >> 1; 21 if(ok(m)) { 22 MAX = max(MAX, m); 23 l = m + 1; 24 } else r = m-1; 25 } 26 int ans = 0; 27 for(int i = 0; i < N; i ++) { 28 for(int j = 0; j < a[i]/MAX; j ++) { 29 if(ans == k) break; 30 printf("%d%c",i," \n"[ans==k-1]); 31 ans ++; 32 } 33 } 34 return 0; 35 }
E
有很多主題,每個主題都有一些題目,選定一些主題,後面主題的問題數一定時前面的兩倍,第一個主題的問題數隨意,求最大的問題數。
水過了,如果存在1,2,3...100000的主題都是1個問題,100001的問題數是100000時就肯定過不了。
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N = 2e5+10; 5 int x, n, a[N], cnt; 6 map<int,int> mp; 7 bool vis[N]; 8 std::vector<int> v; 9 int main() { 10 cin >> n; 11 for(int i = 1; i <= n; i ++) cin >> x, mp[x]++; 12 priority_queue<int, vector<int>, greater<int> > que; 13 for(auto m : mp) a[cnt++] = m.second, que.push(m.second); 14 sort(a,a+cnt); 15 int MAX = 0; 16 for(int i = 1; i <= a[cnt-1]; i ++) { 17 int x = i, ans = 0; 18 while(que.size()) { 19 while(que.size() && que.top() < x) que.pop(); 20 if(que.empty()) break; 21 ans += x; 22 que.pop(); 23 x *= 2; 24 } 25 for(int i = 0; i < cnt; i ++) que.push(a[i]); 26 MAX = max(MAX, ans); 27 } 28 printf("%d\n",MAX); 29 return 0; 30 }