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 }