HDU - 5477 - A Sweet Journey (思维题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5477

题意

Mr.D 带着他的女朋友出去旅行,资金缺乏,就骑着自行车出发了!路途中会遇到沼泽地和平坦路。每在沼泽地骑行一米,Mr.D能量值减少a,每在平坦大路上骑行一米就恢复能量值b。为了能成功到达目的地,在出发前至少需补充多少能量。

                                                                                                                                                                                       

题解

要求至少补充多少,即应使其到达目的地时能量值为0即可。可采用逆向思维,到着来。设ans为Mr.D的能量值。从目的地往回走,遇到沼泽地每米+b,遇到平坦地区每米-b,若减后<0;则应ans = 0.到达出发点后,若ans>=0,则ans = 0;若ans<0,则结果为ans.

AC Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <functional>
#include <algorithm>
#define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int p[100000+5];
int main()
{
    int T;
    cin>> T;
    int k = 0;
    while(T--)
    {
        int n, a, b, l;
        memset(p,0,sizeof(p));
        scanf("%d %d %d %d",&n,&a,&b,&l);
        int x, y;
        for(int i=1; i<=n; i++)
        {
            scanf("%d %d",&x,&y);
            for(int j=y; j>=x+1; j--)
            {
                p[j] = 1;
            }
        }
        int sum = 0;
        for(int i=l; i>=1; i--)
        {
            if(p[i]==0)
            {
                sum -= b;
                if(sum<0) sum = 0;
            }
            else
            {
                sum += a;
            }
        }
        if(sum<0) sum = 0;
        ++k;
        printf("Case #%d: %d\n",k,sum);

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Alibaba_lhl/article/details/81268602