1. 程式人生 > >洛谷——T1725 探險

洛谷——T1725 探險

清空 pre log %d panel dev block con urn

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 namespace
std; 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 探險