题目链接:https://cn.vjudge.net/contest/287272#problem/D
题目大意:n科作业,k天完成。找到每一天完成作业的做大最大值,输出这k个值的和,再输出每天包括这个最大数说完成的作业个数,注意由左向右依次完成作业。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<iostream>
#include<queue>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int cmp1(int a,int b)
{
return a<b;
}
int main()
{
int n,k;
int a[2000],b[2000],c[2001],flag[2000],vis[2000];
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(vis,0,sizeof(vis));
c[0]=0;
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1,cmp);//对初始数组的数据由大到小进行排序
//for(int i=1;i<=n;i++)
// cout<<b[i]<<endl;
for(int i=1;i<=k;i++)
sum+=b[i];//前k大个数的和
for(int i=1;i<=k;i++)//找前k个大数在初始数组的位置
for(int j=1;j<=n;j++)
{
if(b[i]==a[j]&&!vis[j])//找到了这个数,且数组这个位置上的数未被用过(这个是用来避免有两个相同的值,第一个位置上的数若用两次,错)
{
c[i]=j;
vis[j]=1;
//break;
j=n+1;//找到了,就继续找下一个最大数所在的位置
}
}
sort(c+1,c+k+1,cmp1);//对这几个k大数,在原数组中的位置由小到大进行排序
//for(int i=1;i<=k;i++)
// cout<<c[i]<<" ";
int h=0;
for(int i=1;i<k;i++)//k天,每天完成了多少题,从找到的k个大数处进行划分
{
flag[i]=c[i]-h;
h+=flag[i];
}
flag[k]=n-h;
cout<<sum<<endl;
for(int i=1;i<=k;i++)
cout<<flag[i]<<" ";
cout<<endl;
}
return 0;
}