1701C - Schedule Management

C. Schedule Management

链接: problem

分析:

这句话应该会让你立刻联想到二分。很明显,如果你能以在 t t t 时间之前完成任务的方式分配工人,那么你也能在 t + 1 t+1 t+1 或更长时间之前完成所有任务。

如何检查任务是否能在某个时间 t t t 前完成呢?这意味着所有工人都有 t t t 个小时来完成某些任务。如果所有任务都需要 2 2 2 小时才能完成,那么他们每个人都可以完成 ⌊ t 2 ⌋ \lfloor \frac t 2 \rfloor 2t 项任务。因此,他们总共可以完成 ⌊ t 2 ⌋ ⋅ n \lfloor \frac t 2 \rfloor \cdot n 2tn 项任务。

如何将 1 1 1 小时的任务纳入其中呢?我们可以重新分配任务,让每个工人先完成自己擅长的任务,如果时间充裕,再完成其他任务。

总体思路如下。让每个工人 i i i 完成 m i n ( t , c n t i ) min(t, \mathit{cnt}_i) min(t,cnti) 小时的任务。 1 1 1 小时的任务,其中 c n t i \mathit{cnt}_i cnti i i i 个工人所精通的任务数。然后记住他们能完成多少 2 2 2 /小时的任务,即 ⌊ t − m i n ( t , c n t i ) 2 ⌋ \lfloor \frac{t - min(t, \mathit{cnt}_i)}{2} \rfloor 2tmin(t,cnti) 。最后,记住他们精通的任务中有多少没有时间完成,即 c n t i − m i n ( t , c n t i ) \mathit{cnt}_i - min(t, \mathit{cnt}_i) cntimin(t,cnti) 。如果未完成任务数的总和不超过他们有时间完成的任务数的总和,那么所有任务都可以在 t t t 时间内完成。

最糟糕的情况是,如果将所有任务分配给一名工人,而他又不精通其中任何一项,那么完成所有任务可能需要 2 m 2m 2m 个小时。

总体复杂度:每个测试案例 O ( n log ⁡ m ) O(n \log m) O(nlogm)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=1e9+10;
typedef long long ll;
typedef pair<int,int> PII;
int T;
int cnt[N];
int n,m;
bool check(int t)
{
    ll t1=0,t2=0;
    for(int i=1;i<=n;i++)
    {
      if(t>=cnt[i]) t1+=(t-cnt[i])/2;
      else t2+=(cnt[i]-t);
    }
    if(t1>=t2) return true;
    else return false; 
}
void solve()
{
   cin>>n>>m;
   for(int i=1;i<=n;i++) cnt[i]=0;
   for(int i=1,x;i<=m;i++) cin>>x,cnt[x]++;
   int l=0,r=m+1;
   while(l+1!=r)
   {
    int mid=(l+r)/2;
    if(check(mid)) r=mid;
    else l=mid;
   } 
   cout<<r<<endl;
   return ;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--) 
    solve();
    return 0;
} 
  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
node-schedule 是一个用于在 Node.js 中进行定时任务调度的库。它允许你创建各种类型的定时任务,例如执行一次性任务、按照固定时间间隔重复执行任务,或者按照特定的时间规则执行任务。 你可以使用 node-schedule 定义一个定时任务,并指定任务的执行时间。例如,你可以创建一个每天早上 8 点执行的任务,或者每隔一小时执行一次的任务。node-schedule 提供了一些简单易用的方法来定义这些时间规则,使得任务调度变得非常方便。 以下是一个使用 node-schedule 的简单示例: ```javascript const schedule = require('node-schedule'); // 创建一个每天早上 8 点执行的任务 const job = schedule.scheduleJob('0 8 * * *', function() { console.log('任务执行中...'); }); // 创建一个每隔一小时执行一次的任务 const job2 = schedule.scheduleJob('0 * * * *', function() { console.log('任务执行中...'); }); ``` 在上面的示例中,我们使用 `scheduleJob` 方法来创建定时任务。第一个参数是一个时间规则表达式,用来指定任务的执行时间。`'0 8 * * *'` 表示每天早上 8 点执行,`'0 * * * *'` 表示每隔一小时执行一次。 当指定的时间到达时,回调函数会被调用,任务会被执行。 除了以上的例子,node-schedule 还提供了其他一些功能,例如取消定时任务、修改定时任务的执行时间等。你可以查阅官方文档来获取更多关于 node-schedule 的详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值