日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 1533. 郁闷的gxg

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 1533. 郁闷的gxg 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

由于省賽的失利(難以理喻的失常),gxg心情十分沉痛—不能為校爭光,也辜負了老師的一番陪養。除此以外更多的是郁悶,但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!~~~原因是環的存在

  • 看了題解,才恍然大悟——最小費用最大流

  • 設源點和匯點,每個點向旁邊的兩個點(注意是環!)連一條容量為 0 、費用為 1 的邊,

  • 之后源點向每個點都連一條容量為 該點初始球個數 、費用為 0 的邊,

  • 每個點都再向匯點連一條容量為 1 、費用為 0 的邊。

  • 這樣一個神奇的圖就構好啦!接著跑一遍最小費用最大流,輸出最小費用即可。

  • 這可以用 SPFA 實現,每次按最小費用跑一次最短路,更新網絡并累加,循環操作即可。

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。