码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷——P1640 [SCOI2010]连续攻击游戏

时间:2017-09-03 12:11:24      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:span   必须   name   wap   swap   ace   递增   def   描述   

P1640 [SCOI2010]连续攻击游戏

题目描述

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
输出样例#1:
2

说明

Limitation

对于30%的数据,保证N < =1000

对于100%的数据,保证N < =1000000

来源:SCOI 2010

 

并查集

挺考验思维的一道题的

并查集可以将有联系的点更好的关联起来,我们这个地方是要求与1相连接的点的最大连续的个数。与他先连的点一定与他在一个并查集里。接下来我们只需要把能够连起来的点用数组存一下然后后面再进行查询就好了

我们给出的n为边数,有n条边可以将n+1个点连接起来

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 3100000
using namespace std;
bool vis[N];
int n,x,y,fx,fy,fa[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();}
    return x*f;
}
int find(int x)
{
    if(fa[x]==x) return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
int main()
{
    n=read();
    for(int i=1;i<=n+1;i++)
     fa[i]=i;
    for(int i=1;i<=n;i++)
    {
        x=read(),y=read();
        fx=find(x),fy=find(y);
        if(fx==fy) vis[fx]=true;
        else
        {
            if(fx>fy) swap(fx,fy);
            fa[fx]=fy;
            vis[fx]=true;
        }
    }
    for(int i=1;i<=n+1;i++)
     if(!vis[i])
     {
         printf("%d",i-1);
        return 0;
     } 
}

 

洛谷——P1640 [SCOI2010]连续攻击游戏

标签:span   必须   name   wap   swap   ace   递增   def   描述   

原文地址:http://www.cnblogs.com/z360/p/7468990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!