题目描述

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

说明

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

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


  

  其实我们这道题的思路很好想的啊。

当然是一种很不好做的思路。

  就是将两个属性分成左右部点,这时就会发现我们要处理只能用一次就不那么好办了。

  那么我们热动分析一下。

  再一下。

  然后。

正解就是

  所以我们考虑将对于物品 i 的属性 a,b ,分别从 a 和 b 向 i 连一条有向边。将物品的属性当做左部点,编号当做右部点,求最大匹配即可。


vis数组版

奉上代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;const int MA=1000001;
int n;
int head[MA],ecnt,pre[MA*10];
bool vis[MA];
struct ss{int to,nxt;
}t[MA*2];void add(int a,int b) {t[++ecnt].nxt=head[a];t[ecnt].to=b;head[a]=ecnt;return;
}bool dfs(int now) {if(vis[now]) return 0;vis[now]=1;for(int i=head[now];i;i=t[i].nxt) {if(!pre[t[i].to]||dfs(pre[t[i].to])) {pre[t[i].to]=now;return 1;}}return 0;
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) {int a,b;scanf("%d%d",&a,&b);add(a,i);add(b,i);}int ans=0;for(int i=1;i<=2*n;i++) {memset(vis,0,sizeof vis);if(dfs(i)) ans++;else break;}cout<<ans<<endl;return 0;
}

time优化vis

奉上代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;const int MA=1000001;
int n;
int head[MA],ecnt,pre[MA*10];
int vis[MA],tim;
struct ss{int to,nxt;
}t[MA*2];void add(int a,int b) {t[++ecnt].nxt=head[a];t[ecnt].to=b;head[a]=ecnt;return;
}bool dfs(int nw) {for(int i=head[nw];i;i=t[i].nxt) {if(vis[t[i].to]!=tim) {vis[t[i].to]=tim;if(!pre[t[i].to]||dfs(pre[t[i].to])) {pre[t[i].to]=nw;return true;}} }return false;
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) {int a,b;scanf("%d%d",&a,&b);add(a,i);add(b,i);}int ans=0;for(int i=1;i<=10000;i++) {tim++;if(dfs(i)) ans++;else break;}printf("%d\n",ans);return 0;
}

完成。

  谢谢。

转载于:https://www.cnblogs.com/qxyzili--24/p/10620611.html

P1640 [SCOI2010]连续攻击游戏相关推荐

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

    P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...

  2. P1640 [SCOI2010]连续攻击游戏 匈牙利算法

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  3. P1640 [SCOI2010]连续攻击游戏:(二分图)

    lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使 ...

  4. P1640 [SCOI2010]连续攻击游戏 (二分图)

    传送门 题面: 题解: 不看标签还是很难想到建图,看了标签也想不到怎么建图. 因为每个数字只能被选择一次,每个装备也只能被选择一次,那么就可以考虑装备与两个属性之间建边. 那么问题就变成了二分图最大匹 ...

  5. 【洛谷1640】[SCOI2010]连续攻击游戏

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  6. [luoguP1640] [SCOI2010]连续攻击游戏(二分图最大匹配)

    传送门 我们将每一个属性和物品连边,然后枚举从小到大属性跑匈牙利,直到找不到连边 #include <cstdio> #include <cstring> #include & ...

  7. 【二分图】洛谷P1640连续攻击游戏

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  8. 洛谷P1640 连续攻击游戏 二分图匹配

    给出n≤1e6n\leq1e6n≤1e6个装备,每个装备都有两个属性值,它的范围一定在[1,10000][1,10000][1,10000],你每个装备只能选择一个属性值,然后要求出最长的一段从111 ...

  9. [二分图]luogu 1640 连续攻击游戏

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

最新文章

  1. VDI序曲十七 RDVH虚拟主机中开启RemoteFX的硬件配置要求
  2. 【算法微解读】浅谈线段树
  3. Oracle 11gR2发布11.2.0.3 Patchset补丁集-又一重量级更新
  4. 我整理的一个经典分页程序(JSP的)
  5. Vue源码阅读一:说说vue.nextTick实现
  6. requests库post方法如何传json类型的data
  7. jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解
  8. 如何将文件从iPhone或iPad空投到Mac计算机?
  9. 反编译工具Luyten地址
  10. PCB寄生电容和寄生电感的计算
  11. opencv马赛克python实现
  12. 灵活有效的激励手段-鲶鱼效应
  13. 管理信息系统复试——三、管理信息系统战略规划与开发方法
  14. Jikes 研究虚拟机(RVM)一 设计和实现问题
  15. python3 进程池Pool 详解
  16. [Win32] 获取进程完整路径
  17. 明万历年间抗击倭寇援朝战役
  18. Linux 如何查看内存使用情况
  19. i tell you 微软各种 操作系统 应用程序 开发工具 下载
  20. 计算机语言mid是什么意思,MID是什么

热门文章

  1. zabbix agent安装_OpenSUSE RPM安装 zabbix-agent
  2. 在计算机回收站中可以恢复,电脑回收站删除了怎么恢复吗
  3. 用vb6.0查看计算机用户名,如何使用vb6.0输入登录窗口的用户名和密码?
  4. pattern in java_Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)
  5. 传感器怎么获取障碍物的宽度信息_机器人感知 -- 测距传感器
  6. 什么相片可以两张弄成一张_怎么将两张图片合成一张?
  7. android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...
  8. SqlServer2000中作业无法删除的原因和解决办法
  9. Dataframe 新增一列, apply 通用方法
  10. ansible笔记(8):常用模块之系统类模块(二)