【USACO 2020 US Open Bronze】Cowntact Tracing 题解

题目描述

由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们(编号为 1…N)的健康。最近,Farmer John 对他的所有奶牛进行了检测,发现有一部分奶牛对该疾病的检测结果呈阳性。利用牛棚内的视频监控,他得以查看最近的奶牛之间的互动行为,结果发现奶牛们互相打招呼时,她们会握蹄,不幸的是这是一种会将疾病从一头奶牛传播给另一头奶牛的行为。Farmer John 汇总了一个添加了时间戳的清单,每条数据的形式为 (t,x,y),表示在时间 t,奶牛 x 与奶牛 y 握了蹄。Farmer John 同时还知道以下信息:

(一)他的农场上恰有一头奶牛最初带有携带疾病(我们将这头奶牛称为“零号病人”)。

(二)一旦一头奶牛被感染,她会在接下来的 K 次握蹄中传染疾病(可能会与同一头奶牛握蹄多次)。握蹄 K 次后,她不再在此后的握蹄中传染疾病(因为此时她意识到了她会传染疾病,于是会仔细地洗蹄)。

(三)一旦一头奶牛被感染,她会持续处于被感染状态。
不幸的是,Farmer John 不知道他的 N 头奶牛中的哪一头是零号病人,也不知道 K 的值!基于他的数据,请帮助他缩小这些未知量的范围。保证至少有一种可能的情况。

输入

输入的第一行包含 N(2≤N≤100)和 T(1≤T≤250)。下一行包含一个长为 N 的字符串,每个字符均为 0 或 1,表述目前 Farmer John 的 N 头奶牛的状态——0 表示一头健康的奶牛,1 表示一头染病的奶牛。以下 T 行每行包含 Farmer John 的互动清单中的一条记录,由三个整数 t、x 和 y组成,其中 t 为一次互动发生的正整数时间(t≤250),x 和 y 为范围 1…N 内的不同整数,表示时间 t 握蹄的两头奶牛。在每一时刻至多只有一次互动发生。

输出

输出一行,包含三个整数 x、y 和 z,其中 x 为可能为零号病人的奶牛数量,y 为与数据一致的最小可能 K 值,z 为与数据一致的最大可能 K 值(如果通过数据无法推断 K 的上界,z 输出 “Infinity”)。注意可能有 K=0。

样例输入

4 3
1100
7 1 2
5 2 3
6 2 4

样例输出

1 1 Infinity

提示

唯一可能是零号病人的是奶牛 1。对于所有的 K>0,奶牛 1 在时刻 7 感染奶牛 2,而奶牛 3 和奶牛 4 均不会被感染。

来源/作者: USACO 2020 US Open Contest, Bronze

思路:

模拟了解一下

mb数组为输入的目标

wt[i] 表示i握了几次蹄。

now[i]=-1 表示当前i没被感染

now[i]=0 表示当前i感染次数用尽

now[i]>0 表示当前i感染次数为now[i]

用模拟的思想。

实现

for(int i=1;i<=n;i++){  //模拟零号病人
	int bz=0; 
	for(int k=0;k<=wt[i];k++){ //模拟题目中的k
		now[i]=k;
		for(int j=1;j<=t;j++){  //开始模拟
			int js1=0,js2=0;
			if(now[a[j][1]]>0&&now[a[j][2]]==-1){//now[a[j][1]]传染now[a[j][2]]
				now[a[j][2]]=k;
				now[a[j][1]]--;
			}
			if(now[a[j][2]]>0&&now[a[j][1]]==-1){//now[a[j][2]]传染now[a[j][1]]
				now[a[j][1]]=k;
				now[a[j][2]]--;
			}
			if(now[a[j][1]]>=0&&now[a[j][2]]>=0){//双方都已被传染(重点,我考试时就没加这个,WA47.5)
				now[a[j][1]]=min(now[a[j][1]]-1,0);//判断是否出界
				now[a[j][2]]=min(now[a[j][2]]-1,0);
			}
		}
		int bj=0;
		for(int j=1;j<=n;j++){//判断是否等于目标
			if(now[j]!=-1)now[j]=1;
			else now[j]=0;
			if(now[j]!=mb[j]){
				bj=1;
			}
			now[j]=-1;
		}
		if(bj==0){
			y=min(y,k);
			z=max(z,k);
			bz=1;
        if(k==wt[i])z=12345;
		}
	}
	if(bz!=0){
		x+=1;
	}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
USACO2022金组是国际在线判题系统USACO的最高级别,题目难度较高,在该比赛中取得好成绩是一项巨大的成就。以下是对该比赛的一些题目解析。 第一题:“交通计划” 题目要求:给定一个n个节点的有向图,每条边有一个长度,希望添加最少的边使得所有节点连通,求最小生成树的权值和。 解析:该题可以使用Kruskal算法求解,将每条边按权值从小到大排序,再依次加入,判断加入的边是否会形成环,若形成则不加入,直到所有节点连通为止。此时Kruskal算法得到的最小生成树的权值和即为所求。 第二题:“点火计划” 题目要求:给定一个n个节点的有向图,每条边有一个权值和一个点火时长,每个节点有一个点火启动时刻和时刻结束时刻,希望从其中选出一些边点火,使得所有节点都可从点火的边出发到达,且所选点火边的总点火时长最小。 解析:该题可以使用最小费用最大流算法求解。将每条边看做一个容量为1,费用为点火时长的边,源点向节点的点火边容量为1,费用为0的边,节点的点火边向汇点的容量为1,费用为0的边,对这个网络进行最小费用最大流即可得到所选边的总点火时长最小。 第三题:“美味佳肴” 题目要求:给定n个菜品,每个菜品有它的权值和两个类别,希望选出k个菜品,使得选出的菜品数量在每个类别中都不超过$\frac{k}{3}$个,且所选菜品的权值和最大。 解析:该题可以使用动态规划求解。设$f[i][j][k]$表示前i个菜品中,选择j个一类菜品,选择k个二类菜品的最大权值和,状态转移方程为$f[i][j][k]=max(f[i-1][j][k],f[i-1][j-1][k]+a[i],f[i-1][j][k-1]+b[i])$,其中a[i]为i号菜品的权值,若为一类则为该权值,否则为0,b[i]为i号菜品的权值,若为二类则为该权值,否则为0。最终答案为$f[n][$k/3$][$k/3$]。 以上是对USACO2022金组的部分题目的解析,USACO比赛是全球范围内的计算机竞赛,竞争非常激烈,能够在该比赛中脱颖而出是一项非常棒的成就。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值