POJ-3273-Monthly Expense
今天晚上cl叫我写的,我打开一看,一开始没什么思路,感觉很像DP,后来他说就二分就可以了。然后我突然想到这不就是四省赛热身赛的题么,而且白书上也有写题解。。o(︶︿︶)o 唉,题没做还是不熟悉。
因为是把天数化成连续的几段,所以把答案进行二分查找,每个答案可以用线性的时间判断对错,因此总的时间是nlogn。
#include <cstdio> #include <cstring> #include <iostream> #define MAXN 100050 using namespace std; int g[MAXN]; int s; int N,M; bool solve(int m){ int len=1; int tt=0; for(int i=0;i<N;i++){ if(tt+g[i]<=m) { tt=tt+g[i]; } else { if(g[i]>m)return false; tt=g[i];len++; } } if(len<=M) return true; else return false; } int main(){ while(scanf("%d%d",&N,&M)==2){ s=0; for(int i=0;i<N;i++) { scanf("%d",&g[i]); s+=g[i]; } int l=0,r=s; int ans=0; while(l<=r){ int mid=(l+r)>>1; if(solve(mid)){ ans=mid; r=mid-1; } else{ l=mid+1; } } printf("%d\n",ans); } return 0; }