题目链接: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;
}