HDU1422 重温世界杯【DP】

题目链接:

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

HDU1422 重温世界杯【DP】的相关文章

[HDU 1422]重温世界杯(DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422 思路:DP,状态f[i]保存到达第i个城市口袋里的钱和最多能访问到的城市个数,用序列型DP的思想处理,按照终点进行DP即可 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #define MAX

HDU 1422 重温世界杯 基础DP 好题

重温世界杯 Problem Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利.世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回忆的东西.比如我们听到了黄名嘴的3分钟激情解说,我们懂得了原来可以向同一个人出示3张黄牌,我们还看到了齐达内的头不仅能顶球还能顶人…………介于有这么多的精彩,xhd决定重温德国世界杯,当然只是去各个承办世界杯比赛的城市走走看看.但是这需要一大比钱,幸运的是xhd对世界杯的热爱之情打动了德国世界杯

hdu 1422 - 重温世界杯(解题报告)

重温世界杯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5407    Accepted Submission(s): 1859 Problem Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利. 世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回忆的东西.

重温世界杯(最长连续和非负子序列)

重温世界杯 dianwo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5305    Accepted Submission(s): 1817 Problem Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利.世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回

重温世界杯

Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利.世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回忆的东西.比如我们听到了黄名嘴的3分钟激情解说,我们懂得了原来可以向同一个人出示3张黄牌,我们还看到了齐达内的头不仅能顶球还能顶人…………介于有这么多的精彩,xhd决定重温德国世界杯,当然只是去各个承办世界杯比赛的城市走走看看.但是这需要一大比钱,幸运的是xhd对世界杯的热爱之情打动了德国世界杯组委会,他们将提供xhd在中

HDU 1422 重温世界杯--(最长子序列模型,bug)

题意:按照输入的城市序列的顺序环游世界,每个城市有补助和花费,如果补助大于花费,你可以保存剩下的钱以后还能用,如果补助加上你保存的钱小于花费则停止旅游.求最多能去多少城市 分析:这题跟求最长子序列差不多,dp[i]表示走第i个城市时最多经过的城市的数量,如果第i个城市的花费够用那么 dp[i]=dp[i-1]+1,复杂度是 O(n) 这题主要卡在:1.TLE.原因是输入输出用的cin,cout换成标准输入输出就好了 2.WA.以前经过的城市没用完的费用可以留着以后用,这需要用一个tmp保存:城市

hdu 1422 重温世界杯

很简单,没什么好说的,和最长上升序列一个类型 #include<iostream> #define maxn 200000+5 using namespace std; int n,x,y; int mapp[maxn]; int main() { cin.sync_with_stdio(false); mapp[0]=0; while(cin>>n) { for(int i=1;i<=n;i++) { cin>>x>>y; mapp[i]=x-y;

【HDOJ】1422 重温世界杯

简单题. 1 #include <stdio.h> 2 3 #define MAXN 100005 4 5 int wi[MAXN], li[MAXN]; 6 int diff[MAXN<<1]; 7 8 int main() { 9 int n, total, max; 10 int i, tmp; 11 12 while (scanf("%d", &n) != EOF) { 13 for (i=0; i<n; ++i) { 14 scanf(&

杭电dp题集,附链接

Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是