2G 连续攻击游戏

题目

lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。 现在lxhgww想知道他最多能连续攻击boss多少次?

Input

输入的第一行是一个整数N,表示lxhgww拥有N种装备 接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值

Output

输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。

Sample Input

3
1 2
3 2
4 5

Sample Output

2

Hint

【数据范围】
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000

题解

解题思路

为数不多的不抄题解就写出来的题
一把武器有两个值,用了一个,另一个就不能用了
我想到标记,将一把武器看成一条无向边(其实和图没什么关系,这里的边只是用来储存值)
从1开始遍历,找到1连接的的点中值最小的,将这条边标记
直到遍历到k时找不到一把武器可以实现,最多的攻击次数就是k-1

代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e6+5;
struct side {
    int t, next;
}e[N*2];
int head[N], tot = 1;
void add(int x, int y) {
    e[++tot].next = head[x];
    head[x] = tot;
    e[tot].t = y;
}
int n, v[N*2], ans, m;
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        int x, y;
        scanf("%d%d", &x, &y);
        m = max(m, max(x, y));
        add(x, y); add(y, x);
    }
    e[0].t = m + 1;
    for(int x = 1; x <= m + 1; x++) {
        int f = 0, h = 0;
        for(int i = head[x]; i; i = e[i].next) 
            if (!v[i] && e[h].t > e[i].t) h = i, f = 1;
        if (f) v[h] = v[h^1] = 1;
        else {
            ans = x - 1;
            break;
        }
    }
    printf("%d", ans);
    return 0;
}

注意:这个不是正解,毕竟找到一组能卡掉这个代码的数据也很容易,但是原题数据比较水,还是可以水过的

原文地址:https://www.cnblogs.com/shawk/p/12826076.html