您的位置:首页 > 其它

Codeforces 278B Books

2017-07-31 16:26 169 查看
好久没有写二分了

题意:有n本书 每本书有一个阅读时间ai 要在t时间内读最多的书 读书的顺序是连续的,如果无法读完一本书就不能开始

最开始觉得会是个dp,但是动规方程写不出来。想想会不会是二分呢,也写不出来
看了题解发现,输入的时候要做一个巧妙的处理
因为书是连续读的,如果ai存的是第1 到第i本书所用的时间总和的话, 那读【i,j】本书的时间就是ai-aj,这样就不需要循环算了啊!
于是固定一个起点 二分找终点

太久没写二分的结果就是 居然连二分的条件都不会了。

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#define inf 1000000000
using namespace std;

int n, t;
int a[100005];
//int dp[100005];

int main()
{
while(scanf("%d%d",&n,&t) != EOF){
a[0] = 0;
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
a[i] += a[i - 1];
}
//memset(dp,0,sizeof(dp));

int cnt = 0;
for(int i = 0; i < n; i++){

int left = i + 1;
int right = n;
int mid = (left + right) / 2;
while(left <= right){

if(a[mid] - a[i] > t){
right = mid - 1;
}
else{
left = mid + 1;
}

mid = (left + right) / 2;
}

cnt = max(cnt, left - i);
}

printf("%d\n",cnt - 1);
}
return 0;
}
这个区间左右都是闭的,a0 是用来辅助的所以最后答案是cnt - 1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: