代码有详细解释,二分模拟寻找结果,贪心选择从哪开始浇花,原则就是遇到需要浇花的就浇,至于w可以用线段树来维护线段,但也可以用一个数组标记一下,二分总是有很多问题啊,所以写很多输出用来调试,jiong
/*************************************************************************
> File Name: 460c.cpp
> Author: yang
> Mail:826123027@qq.com
> Created Time: 2014年08月22日 星期五 11:17:43
************************************************************************/
#include
using namespace std;
#include
#include
#define N 100005 int a[N]; int main(){ int n,m,w,memory[N],b[N]; while(cin>>n>>m>>w){ int l=0x7FFFFFFF,r=0; for(int i=0;i
>a[i]; if(a[i]
r) r=a[i]; } r+=m;//最长的高度 while(l<=r){//这里一开始没有=号,wa了一次 int tempm=m; int mid=(l+r)>>1; for(int i=0;i
0){ b[i]-=x; tempm-=b[i]; if(tempm<0){ break; } x+=b[i];//x累计能从前面浇花时得到浇花天数 memory[i+w]-=b[i];//长度活了w之后将的得到的浇花天数还回去 } } if(tempm>=0) l=mid+1; else r=mid-1; } printf("%d\n",l-1); } }