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

题意:按照输入的城市序列的顺序环游世界,每个城市有补助和花费,如果补助大于花费,你可以保存剩下的钱以后还能用,如果补助加上你保存的钱小于花费则停止旅游。求最多能去多少城市

分析:这题跟求最长子序列差不多,dp[i]表示走第i个城市时最多经过的城市的数量,如果第i个城市的花费够用那么 dp[i]=dp[i-1]+1,复杂度是 O(n)

这题主要卡在:1.TLE.原因是输入输出用的cin,cout换成标准输入输出就好了

2.WA.以前经过的城市没用完的费用可以留着以后用,这需要用一个tmp保存;城市序列是循环的,也就是说 i,i+1,...n-1,0,1,2...这样的顺序走也是可                                     以的,所以要用一遍循环遍历,看代码就明白了;程序的推进顺序不对,前面改变了的变量会影响后面变量参与的条件判断的结果,详见代码

代码:

#include<cstdio>
#include<cstring>
//#include<iostream>
using namespace std;
int n;
int dp[100007],mx;
int a[100007],b[100007];
int main()
{
    while(scanf("%d",&n)!=EOF){
        mx=0;
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=0;i<n;i++){
            scanf("%d%d",&a[i],&b[i]);
        }
        int tmp=0;
        if(a[0]>=b[0]){
           dp[0]=1;
           tmp=a[0]-b[0];
        }
        for(int i=1;i<2*n;i++){
            if(i>=n&&a[i%n]+tmp<b[i%n]) break;//这句话一定要放在下面的if语句前面,因为tmp可能会被改变,影响结果!
            if(a[i%n]+tmp>=b[i%n]){
               dp[i%n]=dp[(i-1)%n]+1;
               tmp=a[i%n]+tmp-b[i%n];
            }
            else tmp=0;
            mx=mx>dp[i%n]?mx:dp[i%n];//cout<<i<<" "<<a[i%n]<<" "<<b[i%n]<<" "<<dp[i%n]<<" "<<tmp<<endl;
            if(mx==n) break;

        }
        printf("%d\n",mx);
    }
}
时间: 2024-10-04 14:58:56

HDU 1422 重温世界杯--(最长子序列模型,bug)的相关文章

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星意大利. 世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回忆的东西.

[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 重温世界杯

很简单,没什么好说的,和最长上升序列一个类型 #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(&

HDU 1160 FatMouse&#39;s Speed--dP--(元素1递增元素2递降的最长子序列)

题意:找到体重递增速度递降的最长序列 分析:和最长递增子序列一样,不过这里先做处理:先把体重按递增排序,然后找最长递降子序列即可 代码: #include<iostream> #include<algorithm> #include<cstdio> using namespace std; struct node{ int w,s; int t; }a[2000]; int n,i; struct h{ int x; int pre; }dp[2000]; int an

HDU 1513 最长子序列

Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3641    Accepted Submission(s): 1252 Problem Description A palindrome is a symmetrical string, that is, a string read identically from

hdu 1422 环状最大非负子段

题意: 一个列数,构成环形,找出其中满足每走一步都大于等于0的子段的最大长度 解法: 类似环形都是用两个数组相接的方式来实现的,不过看了别人代码发现没有必要,多开一倍空间,直接对下标进行取余操作就可以达到理想效果. 我是枚举环的起点(从0到n - 1),然后每个起点开始的长度为n的序列,用类似最大连续子串和的方法求出其最大子串长度,这样复杂度是O(n2) 有更好的思路:自己把这两倍长度的序列(0到2n - 1),来求最长满足条件的子段(注意子段长度达到n就退出,要不然会求出错),这个思路没有管一

nyoj 题目17 单调递增最长子序列

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 复习了利用二分搜索和额外空间解决最长递增子序列问题,最重要的是二分搜索的