1024 [SCOI2010]游戏
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/23156/1024
来源:牛客网
题目描述
lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。现在lxhgww想知道他最多能连续攻击boss多少次?输入描述:
输入的第一行是一个整数N,表示lxhgww拥有N种装备
接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值
输出描述:
输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。示例1
输入
复制3 1 2 3 2 4 5
输出
复制2
备注:
对于30%30\%30% 的数据,保证N≤1000N \leq 1000N≤1000
对于100%100\%100% 的数据,保证N≤1000000N \leq 1000000N≤1000000
贪心:
是我搞错了还是大佬搞错了。这题直接贪心不就行了,为啥要二分图匹配,。。。
给每个节点按照比较小的关键字排序,然后比较大的关键字排序不排序都行
然后从前往后查找每个1,2,3,4,5.。。和每个节点一一比较
如果每个节点的a和b都不满足条件,把这个b保存下来,如果下次遇到了这个b值直接使用它
就a了啊。
//-------------------------代码----------------------------
//#define int LL
const int N = 1e6+10;
int n,m;
struct Q {
int a,b;
bool operator<(const Q & t )const {
if(a == t.a) {
return b < t.b;
} else return a < t.a;
}
};
Q q[N];
int vis[N];
void solve()
{
cin>>n;
// V<V<int>>mp(n+1,V<int>(m+1));
fo(i,1,n) {
cin>>q[i].a>>q[i].b;
if(q[i].a > q[i].b)swap(q[i].a,q[i].b);
}
sort(q+1,q+1+n);
int sum = 0;
int l = 0;
for(int i = 1;i<=n;i++) {
while(vis[sum + 1]) sum ++ ,l ++ ;
if(q[i].a == 1+sum) {
sum ++ ; l ++ ;
} else if(q[i].b == 1 + sum) {
sum ++ ; l ++ ;
} else vis[q[i].b] = true;
}
cout<<l<<endl;
}
signed main(){
clapping();TLE;
// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}
/*样例区
*/
//------------------------------------------------------------
标签:1024,游戏,int,sum,boss,++,lxhgww,装备,SCOI2010 来源: https://www.cnblogs.com/er007/p/16438964.html