Codeforces 278B Books
2017-07-31 16:26
169 查看
好久没有写二分了
题意:有n本书 每本书有一个阅读时间ai 要在t时间内读最多的书 读书的顺序是连续的,如果无法读完一本书就不能开始
最开始觉得会是个dp,但是动规方程写不出来。想想会不会是二分呢,也写不出来
看了题解发现,输入的时候要做一个巧妙的处理
因为书是连续读的,如果ai存的是第1 到第i本书所用的时间总和的话, 那读【i,j】本书的时间就是ai-aj,这样就不需要循环算了啊!
于是固定一个起点 二分找终点
太久没写二分的结果就是 居然连二分的条件都不会了。
题意:有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
相关文章推荐
- CodeForces 219C Color Stripe
- Codeforces 487D. Conveyor Belts 分块+DP
- Codeforces 768A Oath of the Night's Watch
- codeforces 837A Text Volume
- Codeforces 154B Colliders
- Codeforces 353C Find Maximum【贪心】
- 小朋友学Codeforces(2):Round 454 DIV 2, A
- codeforces 223E 计算几何 图论 网络流思想
- CodeForces 471C MUH and House of Cards
- Codeforces 396B:On Sum of Fractions
- CodeForces - 735D Taxes 数论 哥德巴赫猜想和弱哥德巴赫猜想
- Codeforces 682D Alyona and Strings
- CodeForces 732B Cormen — The Best Friend Of a Man (贪心)
- Codeforces-935C:Fifa and Fafa
- [1002]Codeforces 230A - Dragons
- Codeforces 449 B. Jzzhu and Cities
- Codeforces 415D Mashmokh and ACM DP
- codeforces 755F PolandBall and Gifts(多重背包)
- CodeForces 1B Spreadsheets(EXCEL)
- [Codeforces 484D Kindergarten] DP