链接:Codeforces 1006B - Polycarp's Practice
大意:给你k天时间解决n个问题,每个问题都有一个价值。所有问题必须按顺序解决且在第k天完成。定义每天的价值为当天解决的问题的最大价值,求k天最大的总价值。(1<=k<=n<=2000,1<=ai<=2000)
思路:对问题的价值排序,选出前k个问题,然后再按顺序排序,得到的序列即为每天必须完成的问题,总价值即为这k个问题之和,然后输出每天需要完成的问题个数即可。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct task
{
int ord, value;
bool operator<(task& y)
{
return this->value > y.value;
}
}tasks[1005];
int pos[1005];
int main()
{
int n, k;
while (cin >> n >> k)
{
memset(tasks, 0, sizeof(tasks));
for (int i = 0; i < n; i++)
{
tasks[i].ord = i;
cin >> tasks[i].value;
}
sort(tasks, tasks + n);
int total = 0;
for (int i = 0; i < k; i++)
{
total += tasks[i].value;
pos[i] = tasks[i].ord;
}
pos[k] = n;
sort(pos, pos + k);
cout << total << endl;
cout << pos[1] << (k == 1 ? "\n" : " ");
for (int i = 1; i < k; i++)
cout << pos[i + 1] - pos[i] << (i == k - 1 ? "\n" : " ");
}
return 0;
}