博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 1148E- Earth Wind and Fire
阅读量:4682 次
发布时间:2019-06-09

本文共 1322 字,大约阅读时间需要 4 分钟。

传送门:

 

题意:给你一个数组,你可以进行一个操作:取a[i],a[j],且a[i]<a[j],令d*2<=a[j]-a[i],随后令a[i]+=d;a[j]-=d。问最后能否形成另一数组b,并输出方案

 

思路:先考虑不可能的情况,若两边和不相等,则肯定不可能。如果a数组前k个数的和大于b数组前k个数的和,则不可能,因为我们可以把前k个数看成一个整体,它在操作中只能变大不能变小。

若可能,则从小到大搜一个个消耗即可

……然而我最简单的消耗之前都写错了……

之前是这样的:把a[i]-b[i]>0的分为X组,a[i]-b[i]<0的分为Y组,然后各组加减消耗(当时居然还按照差排了个序!!!)。却没有想到X组中需要减的数可能比Y组中需要加的数还要小,因为再次排序完全打乱了从小到大的顺序

…………结果就是——比赛后删掉sort语句就AC了…………

 

略简洁代码:

1 #include
2 using namespace std; 3 typedef long long ll; 4 const int inf=(int)(2e9); 5 const ll INF=(ll)(5e18); 6 const int N=450010; 7 8 ll n,sa=0,sb=0; 9 ll s1=0,s2=0,c[N];10 struct node11 {12 ll x,id;13 }fa[N],fb[N],a[N],b[N];14 vector
v[3];15 16 bool cmp(node p,node q)17 {18 if(p.x==q.x) return p.id
sb)50 {51 puts("NO");52 return 0;53 }54 }55 puts("YES");56 ll ans=0;57 for(int i=1,j=1;i<=n;i++)58 {59 while(c[i]<0)60 {61 ans++;62 while(c[j]<=0) j++;63 ll d=min(-c[i],c[j]);64 v[0].push_back(a[i].id);65 v[1].push_back(a[j].id);66 v[2].push_back(d);67 c[i]+=d; c[j]-=d;68 }69 } 70 cout<
<
View Code

 

转载于:https://www.cnblogs.com/Forever-666/p/10961868.html

你可能感兴趣的文章
orm框架的学习mybatis
查看>>
第四章 基本数据管理
查看>>
linux命令--chmod
查看>>
daily scrum 11.9
查看>>
2018 CCPC 桂林站(upc复现赛)总结
查看>>
VS文件清理工具--只用于VS--MFC项目
查看>>
增加view的圆角笔记
查看>>
第三次作业--团队展示
查看>>
Windows环境下sublime text 3搭建前端开发环境
查看>>
JS方法用来判断手机是安卓还是ios系统
查看>>
《大道至简》读后感
查看>>
处理某个json文件的代码
查看>>
SQLServer存储过程返回值总结
查看>>
使用Sqlserver事务发布实现数据同步
查看>>
创建一个对象都在内存中做了什么事情
查看>>
使用HTML+CSS,jQuery编写的简易计算器
查看>>
gitlab-ce 安装、汉化与阿里邮箱配置(注意是CE)
查看>>
zabbix3.4 监控ESXI6.7
查看>>
c++继承赋值兼容
查看>>
Bias vs. Variance(4)---根据是high bias还是high variance问题来判断接下来做些什么
查看>>