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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[UVALive 3177] Beijing Guards

發(fā)布時間:2024/1/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [UVALive 3177] Beijing Guards 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖片加載可能有點慢,請?zhí)^題面先看題解,謝謝



Uva的題目還是很好的,比如這道,是一道比較好的思維題,代碼難度不大

首先處理一下偶數(shù)的情況,很簡單,答案是相鄰兩個守衛(wèi)的禮物和的最大值

這兒請 fhr 給出證明:
把物品排成一行,只要一個人從左邊開始取,下一個人從右邊開始取,以此類推,保證不會重復(fù)
fhr 這人平時雖然腦子不太好使,但這個證明還是不錯的。

那么奇數(shù)的情況怎么辦呢,有一種策略是這樣的:
假設(shè)有 \(cnt\) 種物品,第一個人取第 \(1~a[1]\) 個,往后走,編號是偶數(shù)的人從前往后取,奇數(shù)從后往前取,中途必須保證相鄰兩人取的東西不同。
舉個栗子:
就拿樣例的第二組數(shù)據(jù)來說,\(a[]={2,2,2,2,2}\),然后 \(cnt=5\)
在這樣的情況下,每個人取物品的情況分別為 {1,2},{3,4},{5,2},{1,3},{5,4}。

這個東西啊看起來不那么好處理,但是請注意,這道題是不需要輸出方案的,所以我們可以這樣:
\(cnt\) 可以通過二分得到,
\(l[i]\)\(r[i]\),表示第 \(i\) 個人,在 \(1~a[1]\)\(a[1]+1~cnt\) 各取了多少件,顯然 \(l[1]=a[1]\)。
那么這樣,每個人都可以根據(jù)前一個人的 \(l\)\(r\) 值算出自己的 \(l\)\(r\),判一下是否合法就行。

//made by Hero_of_Someone #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define il inline #define RG register using namespace std; il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int n,ans,a[100010]; int l[100010],r[100010];il void init(){ ans=0;for(RG int i=1;i<=n;i++) a[i]=gi();for(RG int i=2;i<=n;i++) ans=max(ans,a[i]+a[i-1]); ans=max(ans,a[1]+a[n]); }il bool ck(int x){ RG int k=x-a[1]; l[1]=a[1];for(RG int i=2;i<=n;i++){if(!(i%2)) l[i]=min(a[i],a[1]-l[i-1]),r[i]=a[i]-l[i];else r[i]=min(a[i],k-r[i-1]),l[i]=a[i]-r[i];if(l[i]+r[i]>x) return 0;if(l[i]<0||r[i]<0) return 0;}if(l[n]>0) return 0;return 1; }il void work(){if(n==1){ printf("%d\n",a[1]); return ; }if(!(n%2)){ printf("%d\n",ans); return ; }RG int l=ans,r=l<<1;while(l<=r){RG int mid=(l+r)>>1;if(ck(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans); }int main(){ while(scanf("%d",&n)&&n){ init(); work(); } return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/Hero-of-someone/p/7651589.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的[UVALive 3177] Beijing Guards的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。