先贴出原题:
LGTB 最近在玩一个类似DOTA 的游戏名叫THD
有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面
每个小兵有一定的血量hi,杀死后有一定的金钱gi
每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他
得到金钱。他也可以不攻击任何小兵。
每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血
量低于1 点,小兵死亡,LGTB 不会得到金钱
现在LGTB 想知道,在他选择最优策略时,他能得到多少钱。
输入
输入第一行包含3 个整数P, Q, N
接下来N 行,每行包含2 个整数hi, gi
第i 个小兵和塔之间的距离为i
输入的意义如题面所示
对于20% 的数据,1 N 4
对于50% 的数据,1 N 20
对于100% 的数据,20 P,Q 200, 1 N 100, 1 hi 200, 0 gi 106
输出
输出包含一个整数W,代表LGTB 最多能获得的金钱
没想到出题者居然知道THD。。。难以置信。。。难道也是东方厨~\(≧▽≦)/~好了好了,回归正题,这道题拿到后简直一脸懵逼,想写DP奈何想不出方程,直接不管随便写了个DFS,连条件都没去思考,居然过了25分,,,这题的正解呢,当然就是DP啦,f[i][j]表示第i个兵在j时间所能取得的最大金钱,下面贴出代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; struct bing { int h,g,t,m; }; bing v[502]; int p,q,n; int s[102][2002]; int main() { freopen("thd.in","r",stdin); freopen("thd.out","w",stdout); scanf("%d%d%d",&p,&q,&n); for (int i=1;i<=n;i++) { scanf("%d%d",&v[i].h,&v[i].g); v[i].t=(v[i].h-1)/q; v[i].m=(v[i].h-v[i].t*q-1)/p+1; } for (int i=0;i<=n;i++) { for (int j=0;j<1002;j++) { s[i][j]=-1000000000; } } s[0][1]=0; for (int i=1;i<=n;i++) { for (int j=0;j<1002;j++) { if (s[i][j+v[i].t+1]<s[i-1][j]) { s[i][j+v[i].t+1]=s[i-1][j]; } if (j>=v[i].m-v[i].t) { if (s[i][j-v[i].m+v[i].t]<s[i-1][j]+v[i].g) { s[i][j-v[i].m+v[i].t]=s[i-1][j]+v[i].g; } } } } int ans=0; for (int i=0;i<1002;i++) { if (s[n][i]>ans) { ans=s[n][i]; } } printf("%d\n",ans); return 0; }
清清正正射命丸文是也~
时间: 2024-10-29 19:06:32