CodeForces - 1006B Polycarp's Practice
题意:
给定n个数,将这 n 个数分成 k 组,使每组当中的最大的数的和最大,输出每一组含多少个数(答案有很多种)。
思路:
用结构体记录每个数的大小和所在的下标,查找出最大的 k 个数,然后按照下标给他们分组就行。
要特殊考虑 k=1的情况
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
struct node
{
int a;
int id;
}p[maxn];
bool cmp(node b,node c)
{
return b.a>c.a;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i].a);
p[i].id = i;
}
int s[2010];
int sum = 0;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=k;i++)
{
sum += p[i].a;
s[i] = p[i].id;
}
sort(s+1,s+k+1);
printf("%d\n",sum);
if(k==1) // 特殊情况
{
printf("%d\n",n);
}
else{
for(int i=1;i<k;i++) // 分组的方法有很多种,只要能分成 k 组就行
{
if(i==1)
printf("%d ",s[i+1]-1);
else
printf("%d ",s[i+1]-s[i]);
}
printf("%d\n",n-s[k]+1);
}
return 0;
}