猿辅导第一题, AC
AC,每次选择人数最大的三个角色, 然后组成一组, 然后每个角色减1,放回数组重新排序(直接排序应该超时,我用的优先队列), 然后再选择人数最多的, 如此往复。
下面是AC的代码, 注意,每次只能减1个人。
为什么每次减1呢, (那么你们为什么要每次选最大的呢?) 减1是因为最大的减1之后,会变成不是最大的。
下面的样例:
1
1 2 2 2 3
[2, 2, 2, 3]
[2, 1, 1, 2]
[1, 1, 0, 1]
[0, 0, 0, 0]
每次减1,答案是3.
如果直接减去2,答案是2,并不是最优的分配。
#include <stdio.h> #include <string.h> #include <vector> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int N = 10000 + 10; int a[N]; int main() { int t; int n; cin >> t; for(int k = 0; k < t; ++k) { priority_queue<int> q; cin >> n; for(int i = 0; i < n; ++i) { cin >> a[i]; if(a[i] == 0) continue; q.push(a[i]); } int ans = 0; while(q.size() >= 3) { int a1 = q.top(); q.pop(); int a2 = q.top(); q.pop(); int a3 = q.top(); q.pop(); /* cout << a1 << " " << a2 << " " << a3 << endl; */ //每次只能减1哦哦,重要!!! int group = 1; ans += group; if(a1 - group > 0) q.push(a1 - group); if(a2 - group > 0) q.push(a2 - group); if(a3 - group > 0) q.push(a3 - group); } cout << ans << endl; } return 0; }