【NOIP提高】钱仓
来源:互联网 发布:qt多线程编程 编辑:程序博客网 时间:2024/05/16 05:44
Description
Solution
比赛的时候看错题目了,还以为是这个钱可以向两边流,结果,样例怎么不对啊!!!!
原来钱,只能向后流TAT
贪心
那么直接贪心就好了。
每个钱为0的点,因为是单方向流动的,所以肯定是最近的那个点流过来的。
所以先找出一个合法的初始节点,满足每个零都会被前面的点填满。
维护每一个非零的点的左边一个非零的点,其实每次暴力枚举就好了。
然后把这个非零的点把当前这个零点填成1。
复杂度O(n)
Code
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)using namespace std;const int maxn=100007;int j,l,t,n,m,r;long long ans,a[maxn*2],i,k;int b[maxn],c[maxn],ll[maxn];int sqr(int x,int y){ if(y>x)return (y-x)*(y-x); else return (n/2-x+y)*(n/2-x+y);}int main(){ scanf("%d",&n); fo(i,1,n){ scanf("%lld",&a[i]); a[i+n]=a[i]; } n*=2; fo(i,1,n){ k+=a[i]-1; if(k<0)k=0,t=0; else if(k>=0)t++; if(t==n/2){ l=i-n/2+1; break; } } fod(i,l+n/2-1,l)if(a[i]>0){k=i;break;} fod(i,l+n/2-1,l){ if(!a[i]){ if(a[k]){ a[k]--; a[i]++; ans+=(i-k)*(i-k); while(!a[k])k--; } } } printf("%lld\n",ans);}
1 0
- 【NOIP提高】钱仓
- 【NOIP提高】种树
- 【NOIP提高】自然数
- 【NOIP提高】礼物
- 【NOIP提高】通讯
- 【NOIP提高】奇袭
- 【NOIP提高】Value
- 【NOIP提高】Binary
- NOIP提高模拟 Binary
- 【NOIP提高】公约数
- NOIP 提高 公约数
- 【NOIP提高】树上路径
- NOIP提高组 单峰
- NOIP提高组 积木
- 【NOIP提高】看电影
- NOIP提高组 看电影
- NOIP提高组 鼎纹
- NOIP提高组 千帆渡
- UIWebview JS和OC相互调用
- 一个礼拜学习指针的总结: 变量和二维数组
- c#调用matlab脚本
- 【转】SQL Server游标的使用
- Android输入框带删除按钮的自定义View
- 【NOIP提高】钱仓
- 《构建之法》读书笔记——第8章 需求分析
- function-a(){}与var-b-=-function(){}的区别
- 图片上水印文字
- Product Roadmap August 2016
- 前华人首富李嘉诚错了,商业全变了!
- 谈谈Parser --王垠
- Android 常见的几种加密方式RSA、CBC的集成
- 半透明AlphaBlend函数简析&SOUI在GDI渲染下text控件不能设置半透明解决方案