ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cf Codeforces Global Round 3 E. Earth Wind and Fire

2019-07-03 19:30:35  阅读:286  来源: 互联网

标签:Fire rep Global cf sumb int needadd 数组 scanf


题目链接:http://codeforces.com/contest/1148/problem/E

 

题意:

       给你2n个数,分别是n个a数组和n个b数组,现在你可以进行这样的变换,每次选择两个数,将它们一个+d一个-d,且2d要小于它们的差,问你能不能用这种操作将a数组变成b数组,如果可以给出操作的下标和要加的d。

做法:

        一开始的做法想简单了,就以为是a的当前最大值和最小值取出将a的min往b的min去做,但是这样的会很可能会超过2d的这个限制,所以要一边加一边找减,由于先经过的排序这样的话会避免出现问题。因为是一加一减且处理的数字是一样的所以总和必须不变这是限制条件。


#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=300005;
ll suma,sumb;
int b[maxn],n;
int ans1[maxn*5],ans2[maxn*5],ans3[maxn*5];
struct node{
    int id,v;
    node(){}
    node(int id,int v):id(id),v(v){}
    bool operator < (const node &a)const{
        return v<a.v;
    }
}e[maxn];
vector<node> ve;
int main(){
    scanf("%d",&n);
    rep(i,1,n){
        scanf("%d",&e[i].v);
        suma+=e[i].v; e[i].id=i;
    }
    rep(i,1,n){
        scanf("%d",&b[i]);
        sumb+=b[i];
    }
    if(suma!=sumb){
        return 0*printf("NO\n");
    }
    sort(b+1,b+1+n);
    sort(e+1,e+1+n);
    bool ok=true;
    int m=0;
    rep(i,1,n){
        if(!ok) break;
        int needadd=b[i]-e[i].v;
        if(needadd==0) continue;
        if(needadd>0) ve.push_back(node(e[i].id,needadd));
        else {
            while(needadd<0){
                if(ve.empty()){ok=false; break;}
                int la=ve.size()-1;
                int fin=min(-needadd,ve[la].v);
                ve[la].v-=fin;
                if(ve[la].v==0) ve.pop_back();
                needadd+=fin;
                m++;
                ans2[m]=e[i].id,ans1[m]=ve[la].id,ans3[m]=fin;
            }

        }
    }
    if(!ok||ve.size()) return 0*printf("NO\n");
    printf("YES\n%d\n",m);
    rep(i,1,m){
        printf("%d %d %d\n",ans1[i],ans2[i],ans3[i]);
    }


    return 0;
}

 

标签:Fire,rep,Global,cf,sumb,int,needadd,数组,scanf
来源: https://blog.csdn.net/qq_41955236/article/details/94588426

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有