[bzoj 1854--SCOI2010]游戏
2018-03-19 13:52
405 查看
lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。
游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。
现在lxhgww想知道他最多能连续攻击boss多少次?
这道题是一道很水的二分图匹配,直接用这个游戏的属性跟这个游戏的编号分别建边,然后从1开始判断是否可行就可以了。用时间撮的话可以更快。
游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。
现在lxhgww想知道他最多能连续攻击boss多少次?
这道题是一道很水的二分图匹配,直接用这个游戏的属性跟这个游戏的编号分别建边,然后从1开始判断是否可行就可以了。用时间撮的话可以更快。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; struct node { int x,y,next; }a[2000010];int len,last[10010]; void ins(int x,int y) { len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len; } int match[1000010]; int chw[1000010]; bool find_muniu(int x) { for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(chw[y]<x) { chw[y]=x; if(match[y]==0 || find_muniu(match[y])==true) { match[y]=x; return true; } } } return false; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); ins(x,i);ins(y,i); } int ans=0; for(int i=1;i<=10000;i++) { if(find_muniu(i)==true)ans++; else break; } printf("%d\n",ans); return 0; }
相关文章推荐
- BZOJ1854: [Scoi2010]游戏
- BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]
- [二分图匹配] bzoj1854: [Scoi2010]游戏
- BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )
- ●BZOJ 1854 [Scoi2010]游戏
- bzoj 1854: [Scoi2010]游戏(并查集)
- BZOJ 1854 【SCOI2010】 游戏
- bzoj 1854: [Scoi2010]游戏(二分图的最大匹配)
- BZOJ 1854 [Scoi2010] 游戏 题解与分析
- 【bzoj 1854】[Scoi2010]游戏 二分图匹配
- bzoj 1854: [Scoi2010]游戏 并查集
- bzoj1854 [Scoi2010]游戏
- AC日记——[SCOI2010]游戏 bzoj 1854
- [bzoj1854][Scoi2010]游戏
- BZOJ 1854 SCOI 2010 游戏 二分图最大匹配
- 【bzoj1854】[Scoi2010]游戏
- bzoj1854 [Scoi2010]游戏 二分图匹配 并查集
- [BZOJ]1854 [SCOI]2010 游戏
- [BZOJ1854][Scoi2010]游戏(二分图匹配/并查集)
- [BZOJ1854][SCOI2010]游戏 二分图最大匹