【中山市选2011】辽哥游戏

辽哥面对一个特殊游戏挑战,需要通过编程策略击败一系列带有防御值和附加值的碉堡。通过炸弹预处理和按特定顺序攻击碉堡以最大化得分,解决过程中涉及排序算法和动态规划。

Description:

 张辽是一个长发飘飘的非常聪明的男孩,人人都称他为“辽哥”。辽哥喜欢玩一个有趣的电脑游戏。这个游戏开始的时候有n个碉堡,每个碉堡拥有一个防御值和一个附加值。玩家拥有一个初始的攻击力。如果玩家破坏了一个碉堡,则他能得到1分。每一次,辽哥会选择一个碉堡进行攻击。所有未被破坏的碉堡会联合起来防御,因此为了破坏那个碉堡,辽哥的攻击力必须大于或者等于所有未被破坏的碉堡的防御值之和,否则辽哥就会输掉游戏。如果辽哥成功破坏了那个碉堡,那么他的攻击力会变成那个碉堡的附加值,然后他可以选择下一个攻击的目标。
  由于辽哥拥有强大的编程能力,他不费吹灰之力就改写了那个游戏。在游戏开始前,他可以用炸弹消灭任意的碉堡,但是他不能通过这种方式来获得分数。问题来了,在游戏开始后,辽哥可以得到的最大分数是多少?
1<=T<=100,1<=n<=1000

题解:

可以感受到这种题是按某个顺序排序,然后就可以顺着做了。

对于一组方案,上下的顺序应该是可以调整的。

假设是a[i],b[i],a[j],b[j]
g是j以下的防御值和。

目前可以,有b[i]>=g+a[j]
不可以交换,则有b[j]<g+a[i]

想办法把g消掉。

g+a[i](g+a[j])>b[j]b[i]
a[i]a[j]>b[j]b[i]
a[i]+b[i]>a[j]+b[j]

因此按照a+b的顺序排个序,后面直接O(Tn2)dp就好了。

Code:

#include<cstdio>
#include<set>
#include<algorithm>
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define fd(i, x, y) for(int i = x; i >= y; i --)
#define min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;

const int N = 1e3 + 5;

int n, m;
struct node {
    int u, v;
} a[N];
int o, f[N], d[N], bz;

bool rank(node a, node b) {
    return a.u + a.v < b.u + b.v;
}

int mi;

int main() {
    while(scanf("%d", &n) != EOF) {
        fo(i, 1, n) scanf("%d %d", &a[i].u, &a[i].v);
        scanf("%d", &m);
        sort(a + 1, a + n + 1, rank);
        bz = 1;
        fo(i, 1, n) if(a[i].u <= m) bz = 0;
        if(bz) {
            printf("0\n");
            continue;
        }
        o = 0;
        fo(i, 1, n) f[i] = a[i].u;
        fo(j, 2, n) {
            mi = 2e9;
            fo(i, 1, n) {
                int x = f[i];
                if(mi <= a[i].v) f[i] = mi; else f[i] = 2e9;
                mi = min(mi, x);
            }
            bz = 0;
            fo(i, 1, n) {
                f[i] += a[i].u;
                if(f[i] <= m) bz = 1;
            }
            if(!bz) {
                printf("%d\n", j - 1);
                break;
            }
        }
        bz = 0; fo(i, 1, n) if(f[i] <= m) bz = 1;
        if(bz) printf("%d\n", n);
    }
}
引用:中山市一个不设区的地级市,它包含了6个街道和18个镇。其中,有石岐街道、东区街道、西区街道、南区街道、五桂山街道、火炬开发区街道等。 引用:根据描述,这个游戏一个给定了起始位置和目标位置的移动游戏。在一个n * m的棋盘上,棋盘上有两种不同的格子,分别用#和@表示。小明每次可以向上、下、左、右四个方向移动一格,如果移动到相同类型的格子上,费用为0,否则费用为1。问题要求计算从起始位置移动到目标位置所需的最小花费。输入包含多组数据,每组数据的格式为:第一行是两个整数n和m,表示棋盘的行数和列数;接下来的n行每行包含m个格子;最后一行是四个整数x1、y1、x2、y2,表示起始位置和目标位置的坐标。当输入的n和m都为0时,表示输入结束。输出每组数据的最小花费,每组数据独占一行。 引用:根据样例输入和输出,可以看出其中一个示例的输入是2行2列的棋盘,棋盘上有两种格子@@和@#;起始位置是(0, 1),目标位置是(1, 0)。根据游戏规则,需要计算从起始位置到目标位置的最小花费。输出为2。 根据以上信息,中山市游戏之间没有直接关联。请问你是想了解中山市举情况吗?如果是的话,请提供更多的相关信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [不设区的地级市之中山市geoJSon可直接使用](https://download.youkuaiyun.com/download/weixin_36323996/12833075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【中山市2009】【BZOJ2464】小明的游戏](https://blog.youkuaiyun.com/CreationAugust/article/details/48679593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值