Educational Codeforces Round 131 (Rated for Div. 2) C. Schedule Management

该博客讨论了一种优化任务分配策略以达到最小完成时间的问题。工人与任务数量分别为n和m,每个任务由特定工人高效完成。通过使用多集(multiset)数据结构,博主提出了一个算法,不断调整任务分配,直到无法进一步减少总完成时间。最终,最多任务数即为完成所有任务所需的最短时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

本题借鉴学姐思路解题非本人。       

       题意:工人(n个),任务(m个),每个任务显示能够熟练完成该任务工人的编号,若工人能熟练完成该工作则1小时完成,不熟练则需要2小时;求完成所有任务所需最小时间?

题解:假设每个任务都先归能熟练完成该任务的相应工人完成,要使完成时间最小,需要将承担任务多的分配给给任务少的(分配方任务时长-1,被分配方任务时长+2),具体操作如下:

①用multiset维持存在重复元素并且有序(升序)的序列。

②统计每个工人熟练的任务数,并插入到集合中。

③判断最多任务数是否能分配给最小任务数(first - 1 >= last + 2)。

▪若可以,修改任务数(multiset元素的值不能在容器中进行修改,但可以插入和删除),继续判断;

▪若不可以,则表明当把当前最多任务数分配给最小任务数时,超过了当前最多任务数,所以当前最多任务数即为完成所有任务所需最小时间。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define endl '\n'
#define N 200005
using namespace std;
const ll inf=0x3f3f3f3f;
const double PI=acos(-1);
const ll mod=1e9+7;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); }
multiset<int>v;
void solve()
{
    v.clear();
    int n,m,k;
    cin >>n>>m;
    int a[n+1]={0};
    while(m--)
    {
        cin >>k;
        a[k]++;
    }
    for(int i=1;i<=n;i++) v.insert(a[i]);
   /* for(auto it:v)
    {
        cout <<it<<"fa"<<endl;
    }*/
    auto l=v.begin(),r=--v.end();
    int ma=*r,mi=*l;
    while(ma-1>=mi+2)
    {
    //    cout <<"fag"<<endl;
        v.erase(v.begin());
        v.erase(--v.end());
        v.insert(ma-1);
        v.insert(mi+2);
        l=v.begin();r=--v.end();
        ma=*r,mi=*l;
    }
    cout <<ma<<endl;
}
int main()
{ios
    int t;
    cin >>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值