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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

补充一下我对 POJ 3273 的理解,这肯定是我一生写的最多的题解。。。

發布時間:2025/4/14 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 补充一下我对 POJ 3273 的理解,这肯定是我一生写的最多的题解。。。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:http://poj.org/problem?id=3273

? ? 當分成的組數越多,所有組的最大值就會越小或不變,這一點不難證明:
? ? 如果當前分成了group組,最大值是max,那么max的這一組天數>=1,這時把max的這一組再分成2組,總的組數變成了group+1,最大值顯然會減小或不變(當還有另一組是max或者max組只包含一天時不變)。
? ? 所以組數和本題的答案是單調的關系。
? ? 設答案在區間[low, high],不難看出low是花費最多的一天的值,high是每天花費的總和。這樣二分尋找答案,效率肯定是很高的。本題確實比較難理解,看了一個小時才差不多理解了,更多二分的細節在代碼注釋中。

  

1 #include <stdio.h> 2 #include <string.h> 3 4 int n, m; //把n天分成m組 5 int money[100000]; //每天的錢數 6 7 //假設答案是mid,驗證是否正確 8 //為了便于說明,設正確答案為ans 9 bool judge(int mid) 10 { 11 //sum表示一組的花費,cnt表示分的組數 12 int sum = 0, cnt = 1; 13 for(int i = 0; i < n; i++) 14 { 15 //因為假設答案是mid,所以當sum + money[i] <= mid時,第i天可以分到上一組中。 16 //這一點很顯然,剩下的天數少了,ans當然會更優 17 if(sum + money[i] <= mid) 18 sum += money[i]; 19 20 //如果第i天不能分到上一組,那么只能再分下一組了,這時組數+1 21 else 22 { 23 sum = money[i]; 24 cnt++; 25 } 26 } 27 //如果分的組數>m,顯然這時假設的答案mid太小了,所以mid要增大 28 if(cnt > m) 29 return 0; 30 31 //否則cnt<=m。 32 //如果cnt<m,根據上面說的單調關系,分更多的組ans會更優,即mid<ans 33 //如果cnt==m,說明此時可以在分m組的情況下ans<=mid,這時繼續嘗試在[low,mid]尋找ans 34 else 35 return 1; 36 } 37 38 int main() 39 { 40 int low = 0, high = 0; 41 scanf("%d %d", &n, &m); 42 for(int i = 0; i < n; i++) 43 { 44 //輸入每天的花費,計算low和high 45 scanf("%d", &money[i]); 46 if(low < money[i]) 47 low = money[i]; 48 high += money[i]; 49 } 50 51 //二分尋找答案,循環在low==high時結束,這時low和high的值都是答案,輸出其中一個就可以 52 while(low < high) 53 { 54 //設答案是mid 55 int mid = (high + low) / 2; 56 if(judge(mid)) 57 high = mid;/*這里有一點不理解,為什么網上大多數代碼寫的high=mid-1也是正確的, 58 如果是在judge中提到的cnt==m的情況,那么ans是<=mid的啊,為什么ans所 59 在的區間可以跳過mid這個點呢?請知道的回復我,謝謝。*/ 60 else 61 low = mid + 1; 62 } 63 //輸出high也可以 64 printf("%d\n", low); 65 return 0; 66 } View Code

?

轉載于:https://www.cnblogs.com/wolfred7464/p/3370976.html

總結

以上是生活随笔為你收集整理的补充一下我对 POJ 3273 的理解,这肯定是我一生写的最多的题解。。。的全部內容,希望文章能夠幫你解決所遇到的問題。

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