JZOJ 1533. 郁闷的gxg
Description
由于省賽的失利(難以理喻的失常),gxg心情十分沉痛—不能為校爭光,也辜負了老師的一番陪養(yǎng)。除此以外更多的是郁悶,但gxg知道大學的大門不會因為自己的郁悶而為自己打開,所以一定要振作起來。為了排遣郁悶,gxg開始玩起了智力游戲。
游戲是這樣子的:
n個盒子被放成一圈,每個盒子按順時針編號為1到n,(1<=n<=1000)。每個盒子里都有一些球,且所有盒子里球的總數不超過n。
這些球要按如下的方式轉移:每一步可以將一個球從盒子中取出,放入一個相鄰的盒子中。目標是使所有的盒子中球的個數都不超過1。
任務
? 從文件d.in中讀入盒子的個數和每個盒子中球的個數
? 計算最少的步數是每個盒子中的球的個數不超過1
? 將結果寫入文件d.out.
Input
輸入文件第一行是一個整數n,表示盒子的個數。以后n行,每行中有一個非負整數,表示每個盒子中球的數目。
Output
輸出文件包含一個數:達到目標所需要的最少步數。
Sample Input
12
0
0
2
4
3
1
0
0
0
0
0
1
Sample Output
19
Solution
這題的數據范圍一看就很小,心里很開心,果斷上貪心……
別提了,直接Wrong Answer!~~~原因是環(huán)的存在。
看了題解,才恍然大悟——最小費用最大流!
設源點和匯點,每個點向旁邊的兩個點(注意是環(huán)!)連一條容量為 0 、費用為 1 的邊,
之后源點向每個點都連一條容量為 該點初始球個數 、費用為 0 的邊,
每個點都再向匯點連一條容量為 1 、費用為 0 的邊。
這樣一個神奇的圖就構好啦!接著跑一遍最小費用最大流,輸出最小費用即可。
這可以用 SPFA 實現,每次按最小費用跑一次最短路,更新網絡并累加,循環(huán)操作即可。
Code
#include<cstdio> using namespace std; const int N=2003,Mx=2e9; int n,tot=1,ans; int first[N],next[N*4],en[N*4],f[N*4],v[N*4]; int que[N*10],dis[N],g[N]; bool bz[N]; inline int read() {int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data; } inline int min(int x,int y) {return x<y?x:y; } inline void link(int x,int y,int z,int p) {next[++tot]=first[x];first[x]=tot;en[tot]=y;f[tot]=z;v[tot]=p; } inline void insert(int x,int y,int z,int p) {link(x,y,z,p);link(y,x,0,-p); } inline bool spfa() {for(int i=1;i<=n+1;i++) dis[i]=Mx;int l=que[1]=0,r=1;while(l<r){int now=que[++l];bz[now]=false;for(int i=first[now];i;i=next[i])if(f[i] && dis[now]+v[i]<dis[en[i]]){dis[en[i]]=dis[now]+v[g[en[i]]=i];if(!bz[en[i]]) bz[que[++r]=en[i]]=true;}}return dis[n+1]<Mx; } inline void work() {int sum=Mx;for(int i=n+1;i;i=en[g[i]^1]) sum=min(sum,f[g[i]]);for(int i=n+1;i;i=en[g[i]^1]){f[g[i]]-=sum;f[g[i]^1]+=sum;ans+=v[g[i]]*sum;} } int main() {n=read();for(int i=1;i<=n;i++) {int x=read();insert(0,i,x,0);insert(i,n+1,1,0);int l=i>1?i-1:n,r=i<n?i+1:1;insert(i,l,Mx,1);insert(i,r,Mx,1);}while(spfa()) work();printf("%d",ans);return 0; }總結
以上是生活随笔為你收集整理的JZOJ 1533. 郁闷的gxg的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3731. 【NOIP2014
- 下一篇: JZOJ 3739. 【TJOI2014