洛谷——T1725 探險
阿新 • • 發佈:2017-06-22
清空 pre log %d panel dev block con urn
樣例輸出 Sample Output
http://codevs.cn/problem/1725/
時間限制: 1 s
空間限制: 256000 KB題目等級 : 鉆石 Diamond
題目描述 Description
有編號為1至n的n個同學一起去探險,現在把他們分成k個小組,每個小組完成一項探險任務。分組時,如果第i人與第j人分在同一組(i<j),則他們之間的所有人(第i+1,i+2,…,j-1個)也必須在同一個小組中。
一個小組內所有人的體力和越小,途中可能越危險。為了確保每個同學的安全,要求分組時,使得所有小組中,體力和最小的那個小組的所有人的體力和盡量大。
依次告訴你每個人的體力,如何分組呢?
輸入描述 Input Description
輸入文件explore.in的第1行有二個正整數n和k,互相之間以一個空格分隔。
第2行有n個正整數(互相以一個空格分隔),表示n個人的體力值。其中第j個整數表示第j個人的體力值。
輸出描述 Output Description輸出文件explore.out中只有1行,該行只有一個整數,表示最佳劃分方案中,最弱的小組中,所有人的體力值之和。
樣例輸入 Sample Input
5 2
5 2 1 6 9
樣例輸出 Sample Output
9
數據範圍及提示 Data Size & Hint分成2個小組時,第1小組由前4個人組成,第2小組由第5個人單獨組成,此時最弱小組的體力和為9(其它劃分方案時最弱小組的體力和都小於9)。
友情提示:題目沒有範圍,最好開大點,開始開了1萬,WA了仨
二分一個ans, check的時候每當有一部分的人的體力值得和>ans,就把和清空記為一組,直到有k組,比較最後一組與ans的大小
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespacestd; 5 6 const int N(2333333); 7 int n,k,val[N]; 8 9 int ans,l,r,mid; 10 bool check(int x) 11 { 12 int temp=0,sum=0; 13 for(int i=1;i<=n;i++) 14 { 15 sum+=val[i]; 16 if(sum>x) sum=0,temp++; 17 if(sum<x&&temp>=k) return false; 18 } 19 return true; 20 } 21 22 int main() 23 { 24 scanf("%d%d",&n,&k); 25 for(int i=1;i<=n;i++) 26 scanf("%d",val+i),r+=val[i]; 27 for(;l<=r;) 28 { 29 mid=l+r>>1; 30 if(check(mid)) 31 { 32 ans=mid; 33 r=mid-1; 34 } 35 else l=mid+1; 36 } 37 printf("%d\n",ans); 38 return 0; 39 }
洛谷——T1725 探險