链接: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;
}

/*样例区


*/

//------------------------------------------------------------