题目
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;
}
注意:这个不是正解,毕竟找到一组能卡掉这个代码的数据也很容易,但是原题数据比较水,还是可以水过的