Polycarp's Practice CodeForces - 1006B

本文介绍了一种解决算法竞赛中作业调度问题的方法,通过找出前k大作业并按其在原始数组中的位置重新排序,实现了在限定天数内最大化每日完成作业数的目标。文章详细阐述了实现过程及代码细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值