【UVA - 1335】Beijing Guards (贪心,二分)
生活随笔
收集整理的這篇文章主要介紹了
【UVA - 1335】Beijing Guards (贪心,二分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
題目大意:
有n個人為成一個圈,其中第i個人想要r[i]種不同的禮物,相鄰的兩個人可以聊天,炫耀自己的禮物。如果兩個相鄰的人擁有同一種禮物,則雙方都會很不高興,問最少需要多少種不同的禮物才能滿足所有人的需求,假設每種禮物有無限多個。 n<=100000
解題報告:
http://www.cnblogs.com/kickit/p/7619889.html
http://www.bubuko.com/infodetail-645767.html
總之就是偶數個的時候直接貪出相鄰兩者的最大值就可以。
? ? ? ? ? ? ? 奇數的時候:先單獨安排第一個,并以這一個為分界線分為左右兩個區域部分,然后剩下的分奇偶進行安排(第奇數個盡量往右安排,第偶數個盡量往左安排),然后安排到最后一個一定是盡量往右安排的,然后我們看這個是否和第一個有沖突就行了,如果沒有沖突那一定是可以的,如果有沖突那一定就是說明我們用的李無數是不夠的,因為我們這樣一定是最優解了。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int INF = 0x3f3f3f3f; const int MAX = 2e5 + 5; int a[MAX]; int L[MAX],R[MAX]; int n; bool ok(int x) {int l=a[1],r=x-a[1];L[1]=a[1];R[1]=0;for(int i = 2; i<=n; i++) {if(i%2==1) {R[i] = min(r-R[i-1],a[i]);L[i] = a[i]-R[i];}else {L[i] = min(l-L[i-1],a[i]);R[i] = a[i]-L[i];}}return L[n]==0;//填L[n]<=0也可以AC,,但是在這里還是==0比較好理解,因為L和R這兩個數組都不存在為負情況。} int main() {while(~scanf("%d",&n)) {if(n == 0) break;int maxx = 0;for(int i = 1; i<=n; i++) {scanf("%d",a+i);maxx = max(maxx,a[i]+a[i-1]);}maxx = max(maxx,a[1]+a[n]);if(n == 1) {printf("%d\n",a[1]);continue;}else if(n % 2 == 0) {printf("%d\n",maxx);continue;}int l = maxx,r = INF;int mid = (l+r)>>1;while(l < r) {mid = (l+r)>>1;if(ok(mid)) r = mid;else l = mid+1;}printf("%d\n",l);}return 0 ;}?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【UVA - 1335】Beijing Guards (贪心,二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【 HDU - 3062】Party(2
- 下一篇: 国债逆回购收益为什么会涨?影响国债逆回购