Math Show CodeForces - 846B

题目

题意:

有n个任务,每个任务有k个子任务,有m的时间来完成任务。每个任务的第i个子任务需要时间都是ti。完成一个子任务获得一分,完成一个大任务的所有子任务额外得一分。问如何在时间不超过m的情况下得到尽可能多的分。

方法:

枚举完成多少个大任务,直到时间不够。对于每次枚举,将剩下的所有大任务的子任务抽出来,按需要时间从短到长一个一个去完成,直到时间不够。记录能得到的最大分数。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int ans=0,n,k,m,sum;
 5 int a[100];
 6 int main()
 7 {
 8     int ans1,i,j,j1,m1;
 9     scanf("%d%d%d",&n,&k,&m);
10     for(i=1;i<=k;i++)
11     {
12         scanf("%d",&a[i]);
13         sum+=a[i];
14     }
15     sort(a+1,a+k+1);
16     for(i=0;i<=n;i++)
17     {
18         m1=m-i*sum;
19         if(m1<0)    break;
20         ans1=i*(k+1);
21         for(j1=1;j1<=k;j1++)
22             for(j=1;j<=n-i;j++)
23             {
24                 m1-=a[j1];
25                 if(m1<0)    goto lb;
26                 ans1+=1;
27             }
28         
29         lb:
30             ans=max(ans,ans1);
31     }
32     printf("%d",ans);
33     return 0;
34 }
posted @ 2017-09-07 18:39  hehe_54321  阅读(316)  评论(0编辑  收藏  举报
AmazingCounters.com