杭电1422
来源:互联网 发布:部落冲突8本满科技数据 编辑:程序博客网 时间:2024/05/25 12:22
这是一比较简单的DP题,差不多是最大字段和吧。和前面的最大连续子序列有一点点像。但是这一题加深了一点难度。就是他并不一定是从最开始的开始计算。而是固定的距离就是说可以走的话,无论从什么地方走都要吧路线走完。所以这个就需要一点拐弯。题目:http://acm.hdu.edu.cn/showproblem.php?pid=1422中文的都知道什么意识我就不解释了。这时候我们想的就是他从一个地方开始走要想走下去的话,就需要他以前剩余的钱数(第一天的时候以前剩余的钱是0)加上今天的费用大于等于今天需要有的花费。这就自然而然的看到了解题的方向。有了大概的思路我们再来讲讲细处:
首先如果开始从j到某一天i走不了了那么我们应该记录这个最大的天数,之后再从i之后算起(之所以不从j+1计算那是因为我们知道j是有剩余的钱的(最少是0)那么就算从j+1算起到i还是会走不下去这样的话就少了一天)。直到下一个k走不动,i+1到k的时间,看看和之前的谁大谁小。
其次我们还要注意这个最大的天数是在for循环求的就是for(m=0;m<n;m++);那么假如说一直可以往后走不会断的话那么最大值Max就一直是0;
最后假如说我们从k走到N-1(最后)还没有走完,那么就需要从0在开始走,最多到k-1天。
有了上面这些这题就出来了,至于数据,下面提供一个AC代码大家可以自己设置数据检测:
#include<iostream>using namespace std;const int Max=100005;int a[Max],b[Max];//a是生活费int main(){ int N; int i,j,m; int p; while(scanf("%d",&N)!=EOF) { m=-1; j=0; int max=0; int num=0; int sum=0; for(i=0;i<N;i++) scanf("%d%d",&a[i],&b[i]); for(i=0;i<N;i++) { if(a[i]+sum-b[i]>=0) { sum=a[i]+sum-b[i]; num++; if(i==N-1) {
for(p=0;p<=m;p++) if(a[p]+sum>=b[p]) { sum=a[p]+sum-b[p]; num++; } else break; } } else { m=i; sum=0; if(num>max) { max=num; } num=0; } } if(num>max) max=num; cout<<max<<endl; } return 0;}
0 0
- 杭电1422
- 杭电1422
- 杭电 1422 重温世界杯
- 杭电1422 重温世界杯
- 杭电
- 杭电
- 杭电
- 杭电 1234 和 杭电 2115
- 杭电2056之Rectangles 杭电
- 杭电ACM1061Rightmost Digit
- 杭电2099 7.11
- 杭电ACM 1003
- 杭电 ACM 2016
- 杭电ACM1466
- 杭电ACM1003
- 杭电ACM1225
- 杭电ACM2023
- 杭电ACM2602
- 实现RSA算法
- Ubuntu 命令行和图兴界面切换
- hadoop自学轨迹-简单认识HDFS
- Android Service 之三(Bind Service, 继承自 Binder 类)
- Some js Demo
- 杭电1422
- DotNetBar布局(一)
- 基于linux-2.6.35的网络视频服务器移植
- Basic Level 1013. 数素数 (20)
- Sum Root to Leaf Numbers
- 僵尸进程和如何删除僵尸进程
- servlet与数据库的连接
- Html position(static、relative、absolute、fixed)
- makefile简单实例