猿辅导第一题, 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;
}
查看23道真题和解析