CF1701C Schedule Management
作者:互联网
有 n 个工人和 m个任务,每个任务都有且仅有一个工人擅长做,如果让擅长做的工人去做,那么要花一个单位时间,否则要花两个单位时间。请问完成所有的任务至少要花多少时间。
注意:每项工作只能由一个工人完成,不能合作完成。
分情况:例如 1 1 1 1,时间给了3单位,1最多再3单位时间内完成三个,剩下的得找其他人来做。那2呢他没有擅长的但是他在三时间的单位内能完成1个他不擅长的工作。这样一来我们就可以推公式。我们设res为空余时间能够做多少工作。设a[i]为他所擅长的工作数,时间为x,当时间大于擅长数说明有空余时间,(x-a[i])/2代表空余的时间还能做几件工作,当擅长数大于时间数,说明得其他人帮他做res-=(a[i]-x)。二分枚举答案即可。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=2e5+10; 5 int a[N]; 6 int n,m; 7 bool check(int x) 8 { 9 int res=0; //空闲时间足够做多少不熟练的工作 10 for(int i=1;i<=m;i++) 11 { 12 if(a[i]<=x) //自己时间富足 有空闲时间 13 { 14 res+=(x-a[i])/2; 15 }else { 16 res-=(a[i]-x);//将自己的工作移交他人 17 } 18 } 19 return res>=0; 20 } 21 int main() 22 { 23 int t; 24 cin>>t; 25 while(t--) 26 { 27 cin>>m>>n; 28 memset(a,0,sizeof a); 29 for(int i=1;i<=n;i++) 30 { 31 long long x; 32 cin>>x; 33 a[x]++; 34 } 35 long long ans=400005; 36 long long l=0,r=400005; 37 while(l<=r) 38 { 39 int mid=(l+r)>>1; 40 if(check(mid)) 41 { 42 ans=mid; 43 r=mid-1; 44 }else l=mid+1; 45 } 46 printf("%lld\n",ans); 47 } 48 return 0; 49 }
标签:Management,Schedule,int,res,CF1701C,mid,long,擅长,时间 来源: https://www.cnblogs.com/acmzk/p/16480534.html