博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AtCoder010】B - Boxes(差分)
阅读量:7117 次
发布时间:2019-06-28

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

AtCoder Grand Contest 010 B题

题意

n个盒子,第i个盒子有ai个石头。

重复这个步骤:选一个盒子i,每次从第i+j个盒子中移走j个石头,j从1到n,第n+k个盒子被称为第k个盒子。若某一轮有盒子里石头不够,就停止,且这一轮都不能执行。问能否清空所有盒子。

题解

首先每轮减少的值是\(t=\sum_{i=1}^{i=n}i\),因此\(\sum_{i=1}^{i=n}a_i\)必须是t的倍数,否则NO。

这个倍数就是操作的轮数,设为k。
计算出差分\(d[i]=a[i]-a[i-1]\),对于差分来说,每一轮有一个位置是增加了\(1-n\),其它位置是增加了1。
现在我们倒回去模拟,每一轮给差分最小的加上\(n-1\),其它位置-1,如果能使所有差分变为0,那么就是YES。
但是直接模拟肯定超时。
可以观察到k轮后每个位置都减去了若干个1和1-n,把k个1提出来,也就是每个位置先减去k,d[i]-k得是n的倍数,而且是负数[修正:或0],才是YES,否则NO。

代码

#include 
#include
#include
#include
#define ll long long#define N 100005#define inf 0x3f3f3f3fusing namespace std;ll sum,a[N],t,tmp,n;int main() { cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; sum+=a[i]; t+=i; } if(sum%t)cout<<"NO"; else{ tmp=a[1]; for(int i=1;i
0)ok=0; } if(ok)cout<<"YES"; else cout<<"NO"; } return 0;}

转载地址:http://rbfel.baihongyu.com/

你可能感兴趣的文章
Google Auth+openssh
查看>>
NFS服务器配置及客户端挂载
查看>>
ELK(elasticsearch+logstash+kibana)开源日志分析平台搭建
查看>>
Debian 8.0桌面系统root用户登录和root用户自动登录
查看>>
Windows 8 新启动方式:混合启动(Hybrid Boot)
查看>>
*.manifest 文件
查看>>
要在jsp界面上显示一行三个控件
查看>>
我的linux学习之路-文件的创建于删除
查看>>
Linux日志分析
查看>>
ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr]
查看>>
发布/订阅模式
查看>>
RHCE证书的获得过程--1
查看>>
Java (基础自总结)
查看>>
eyoucms uihtml 带html富文本可视化标签
查看>>
SAMBA服务的搭建和访问
查看>>
nginx+webdav
查看>>
Oracle排错工具oerr
查看>>
JSP中出现According to TLD or attribute directive i...
查看>>
css !important用法CSS样式使用优先级判断
查看>>
教你如何让文件“在线对其隐身”
查看>>