C - Job Interview

思路:

先不考虑溢出,将n+m+1按照分配的工作分类

会发现,有且仅有一种工作的人数是溢出的,即超过了上限,记作工作1;且另一种工作的人数没有溢出,记作工作2

工作2因为没有溢出,不管没来的那个人是谁,工作2的人还是做工作2,不受影响

工作1溢出了,若没来的那个人在工作1前n个位置,答案是工作1前n+1个人做工作1+其他人做工作2-没来的那个人做工作1;

其他情况答案是前n个人做工作1+其他人做工作2-没来的那个人做工作2

代码:

void solve(){
    int n,m;
    cin>>n>>m;
    int k=n+m+1;
    vector<int>a(k),b(k);
    for(int i=0;i<k;i++) cin>>a[i];
    for(int i=0;i<k;i++) cin>>b[i];
    
    vector<int>f(k);
    vector<vector<int>>p(2);
    for(int i=0;i<k;i++){
        if(a[i]>b[i]){
            f[i]=0;
            p[0].push_back(i);
        } 
        else{
            f[i]=1;
            p[1].push_back(i);
        } 
    }
 
    if(p[0].size()<=n){
        swap(n,m);
        swap(a,b);
        swap(p[0],p[1]);
        for(int i=0;i<k;i++) f[i]^=1;
    }
 
    ll s1=0,s2=0;
    for(int i=0;i<n;i++){
        int j=p[0][i];
        s1+=a[j];
    }
    for(int i=n;i<p[0].size();i++){
        int j=p[0][i];
        s1+=b[j];
    }
    for(auto j:p[1]){
        s1+=b[j];
    }
    s2=s1+a[p[0][n]]-b[p[0][n]]; //s1是前n个人工作1,后m+1个人工作2,s2是前前n + 1个人工作1,后m个人工作2
    
    vector<ll>ans(k);
    int cnt=0;
    for(int i=0;i<k;i++){
        if(f[i]==0&&cnt<n) ans[i]=s2-a[i];
        else ans[i]=s1-b[i];
 
        if(f[i]==0) cnt++;
    }
    
    for(auto x:ans){
        cout<<x<<' ';
    }
    cout<<'\n';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临江浪怀柔ℳ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值