题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1422
题目大意:
给你N个城市,参观路线为1~2~3~4~5~…~N~1。可以从任何一座城市开始参观。每座城市提供的
生活费和需要的花费都不同,问:最多能参观多少个城市。
思路:
因为能形成循环,所以在原有数据的后边再接上1~N的数据。然后用动态规划来做。状态为:当上一
个城市剩下的钱不为负(即还未结束旅游),如果上一个城市剩下的钱加上当前城市的钱大于当前的生活
费,那么dp[i] = dp[i-1] + 1,更新剩下的钱,如果不够旅游了,就将剩下的钱归为0,从当前点开始
旅游,计算最大的dp[i],得到的就是最多能参观的城市数。这里加一个优化,当dp[i] == N(即参观完
N个城市)的时候,跳出循环。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 200010; int W[MAXN],L[MAXN],dp[MAXN]; int main() { int N,i; while(~scanf("%d",&N)) { dp[0] = 0; for(i = 1; i <= N; ++i) { scanf("%d %d",&W[i],&L[i]); W[i+N] = W[i]; L[i+N] = L[i]; dp[i] = dp[N+i] = 0; } int cost = 0, Max = 0; for(i = 1; i <= 2*N; ++i) { if(cost + W[i] >= L[i]) { dp[i] = dp[i-1] + 1; cost = cost + W[i] - L[i]; } else cost = 0; if(dp[i] > Max) Max = dp[i]; if(dp[i] == N) break; } printf("%d\n",Max); } return 0; }
时间: 2024-09-29 16:39:40