其他分享
首页 > 其他分享> > CF1701C Schedule Management

CF1701C Schedule Management

作者:互联网

题目:Problem - C - Codeforces 

 

    有 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