博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1854[Scoi2010] 游戏
阅读量:5269 次
发布时间:2019-06-14

本文共 1327 字,大约阅读时间需要 4 分钟。

题目链接:

题目大意:

有n种装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当使用某种装备时,只能使用该装备的某一个属性。并且每种装备最多只能使用一次。

要攻击boss了,但所使用的属性值必须从1开始连续递增才能对boss产生伤害。也就是说一开始的时候,只能使用某个属性值为1的装备攻击,然后只能使用某个属性值为2的装备攻击,然后只能使用某个属性值为3的装备攻击……以此类推。 问他最多能连续攻击boss多少次?

题解:

匈牙利求二分图最大匹配

一样的,把装备和属性值分开构造二分图。因为要连续攻击,而且要递增,所以改成枚举属性值跑匹配就好了,如果无法匹配的话就可以直接break。

//收回上一题说过的话..如果我GDKOI前做了这题,那么我一!定!不会想到贪心了。神tm几乎一模一样。

#include
#include
#include
#include
#include
using namespace std;#define maxn 1001000struct node{ int x,y,next;}a[maxn*2];int first[maxn],len;int ask[maxn],bf[maxn],tim;void ins(int x,int y){ ++len;a[len].x=x;a[len].y=y; a[len].next=first[x];first[x]=len;}bool ffind(int x){ for (int i=first[x];i!=-1;i=a[i].next) { int y=a[i].y; if (ask[y]!=tim) { ask[y]=tim; if (bf[y]==-1 || ffind(bf[y])) { bf[y]=x; return true; } } }return false;}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int n,i,x,y; scanf("%d",&n); len=0;memset(first,-1,sizeof(first)); for (i=1;i<=n;i++) { scanf("%d%d",&x,&y); ins(x,i);ins(y,i);bf[i]=-1; } memset(ask,0,sizeof(ask)); // memset(bf,-1,sizeof(bf)); tim=0; for (i=1;i<=10000;i++) { tim++; if (!ffind(i)) break; } printf("%d\n",i-1); return 0;}

转载于:https://www.cnblogs.com/Euryale-Rose/p/6527804.html

你可能感兴趣的文章
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
A-Softmax的总结及与L-Softmax的对比——SphereFace
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
linux下WPS的使用
查看>>
Web Api 利用 cors 实现跨域
查看>>
hdu 3938 并查集
查看>>
instanceof
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>