day1 LGTB玩THD

先贴出原题:

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

day1 LGTB玩THD的相关文章

[DP] LGTB 玩THD (复杂状态DP)

LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他得到金钱.他也可以不攻击任何小兵.每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血量低于1 点,小兵死亡,LGTB 不会得到金钱现在LGTB 想知道,在他选择最优策略时,

[题解]?LGTB 玩THD

LGTB 最近在玩一个类似DOTA 的游戏名叫THD 有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi 每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他得到金钱.他也可以不攻击任何小兵. 每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血量低于1 点,小兵死亡,LGTB 不会得到金钱 现在LGTB 想知道,在他选择最优策略时,他能得到多少

day1 LGTB玩扫雷

先附上原题: 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘输入输入第一行包含两个整数n, m 代表棋盘大小接下来n 行,每行m 个字符,代表棋盘1 n,m 1000输出输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘O(∩_∩)O哈!这道题,毫无算法可言就是了,纯暴力循环...那么,下面贴出代码: #include<cstdio> #incl

day1 LGTB学分块

原题如下: LGTB最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成3块今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成3块,块可以为空.假设3块各自的和中的最大值最小请输出分完之后3 块中的最大值输入输入第一行包含一个整数n 代表数组大小接下来n 个整数a1, a2, ..., an,代表数组对于40% 的数据,1=<n<= 10对于70% 的数据,1=<n<=103对于100% 的数据,1=<n<=105, 1=<ai<

[无主题] 三题

1.LGTB 玩扫雷 题意 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 输入输入第一行包含两个整数n, m 代表棋盘大小接下来n 行,每行m 个字符,代表棋盘1≤n,m≥1000 输出输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘 样例 样例输入3 3*.*...*.* 样例输出*2*242*2* 提示:暴力 1 #include<iost

[铁一中OI模拟赛]2017.8.20 Day2

T1 LGTB 玩扫雷 题目链接 思考: 纯模拟题,没啥说的. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) int n,m,map[1005][1005]; char s[233]; int fx[]={0,0,-1,-1,-1,0,1,1,1},fy[]={0,-1,-1,0,1,1,1,0,-1}; int main(){ //freopen(&

ZJOI2017 day1滚粗记

这几天去温州作为外省选手参加了$ZJOI day1$.打了几天的酱油,考试也滚粗了.. $day -2$ 中午从学校出发,坐飞机去温州.到了温州以后吃完晚饭就回宾馆.把一直想做的糖果公园做完了以后就堕落了一晚..玩了好久.. $day -1$ 上午听周子鑫大佬讲搜索.前几题还挺简单的,开始讲$dancing-links$以后就有点懵逼了.原理大概还是听懂了,但是完全不会实现..然后讲了很多玄学搜索题,感觉后面讲的那几题都有点懵懵懂懂,讲得好快难以接受.. 下午开始就正式进入懵逼阶段了.下午讲课一

遥望布达拉——DAY1 成都-雅安

由于昨晚讨论路线加扯淡睡得比较晚,早上7点才起床,虽然以后几乎每天都这个点起,但相对于今天150km的路程,又是第一天骑需要适应节奏,注定是个悲剧.不过,不用担心,这仅仅是川藏线酸甜苦辣的开始. 先来介绍一下另外4个队友吧 左一老陈:哈尔滨人,工作三年,成熟稳重,身体综合素质较强,请了一个月假出来,骑完就要去非洲出差了,要被晒成黑球了,哈哈 右三老彭:湖北人,武汉理工大学材料学研一,骑行经验较丰富,竟然背着导师偷偷跑出来,胆儿真肥.不过他到理塘就转去稻城亚丁了,和我们只是顺路10天 右二小鹏:福

NOIP2013/day1/1/转圈游戏

总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制:128000KB 描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从 0 到 n-1.最初,第 0号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类 推. 游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,……,依此类推,第n − m号位置上的小伙伴走到第 0 号位置,第n-m+1 号位置上