首页 > 其他分享 >题解:P9954 [USACO20OPEN] Cowntact Tracing B

题解:P9954 [USACO20OPEN] Cowntact Tracing B

时间:2024-10-02 17:48:21浏览次数:7  
标签:false P9954 题解 int num infected Tracing bool 101

考虑暴力。

枚举让每头牛都当一次“零号病人”和 \(K\) 的所有组合,模拟感染的过程,检查得出的病人是否和给出的一样即可。

代码:

#include<bits/stdc++.h>
using namespace std;
bool infectedd[101];
int N,cowx[251],cowy[251];
bool check(int patient_zero,int K){
	bool infected[101]={false};
	int num[101]={0};
	infected[patient_zero]=true;
	for(int t=0;t<=250;t++){
		int x=cowx[t],y=cowy[t];
		if(x>0){
			if(infected[x]) num[x]++;
			if(infected[y]) num[y]++;
			if(num[x]<=K&&infected[x]) infected[y]=true;
			if(num[y]<=K&&infected[y]) infected[x]=true;
		}
	}
	for(int i=1;i<=N;i++)
		if(infected[i]!=infectedd[i]) return false;
	return true;
}

int main(){
	int T,t,x,y;
	string s;
	cin>>N>>T>>s;
	for(int i=1;i<=N;i++)
		infectedd[i]=s[i-1]=='1';
	for(int i=0;i<T;i++){
		cin>>t>>x>>y;
		cowx[t]=x;
		cowy[t]=y;
	}
	bool pi[101]={false};
	bool pk[252]={false};
	for(int i=1;i<=N;i++)
		for(int K=0;K<=251;K++)
			if(check(i,K))
				pi[i]=true,pk[K]=true;

	int lower_K=251,upper_K=0,pz=0;
	for(int K=0;K<=251;K++) if(pk[K]) upper_K=K;
	for(int K=251;K>=0;K--) if(pk[K]) lower_K=K;
	for(int i=1;i<=N;i++) if(pi[i]) pz++;
	cout<<pz<<" "<<lower_K<<" ";
	if(upper_K==251) cout<<"Infinity\n";
	else cout<<upper_K<<"\n";
	return 0;
}

标签:false,P9954,题解,int,num,infected,Tracing,bool,101
From: https://www.cnblogs.com/cly312/p/18444915

相关文章

  • 题解:SP9934 ALICE - Alice and Bob
    状态表示:使用两个变量来表示当前游戏的状态:\(a\)表示包含\(1\)个石子的堆的数量,\(b\)表示包含多于\(1\)个石子的堆的可操作次数。游戏策略:从包含多个石子的堆中取走一个石子,这会减少\(b\)。从包含\(1\)个石子的堆中取走一个石子,这会减少\(a\)。合......
  • 题解:P9939 [USACO21OPEN] Acowdemia III B
    考虑贪心。遍历每只奶牛:如果它最多与一头奶牛相邻,那么什么都不会发生。如果它与两头以上的奶牛相邻,那么它与两侧的两头奶牛相邻。将答案递增\(1\)。否则,如果正好有两头相邻的奶牛,我们就把它们配对。也就是说,将这对奶牛插入一组。代码:#include<bits/stdc++.h>usingname......
  • 题解:UVA1500 Alice and Bob
    状态表示:使用两个变量来表示当前游戏的状态:\(a\)表示包含\(1\)个石子的堆的数量,\(b\)表示包含多于\(1\)个石子的堆的可操作次数。游戏策略:从包含多个石子的堆中取走一个石子,这会减少\(b\)。从包含\(1\)个石子的堆中取走一个石子,这会减少\(a\)。合......
  • 题解:P9788 [ROIR 2020 Day2] 区域规划
    法1枚举\(a,b,c\),考虑到\(c\)的最小值为\(\max(1,\frac{(a\cdotb−n)}{b})\),所以直接剪枝即可通过。代码:#include<bits/stdc++.h>usingnamespacestd;intans,n,m;intmain(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(i......
  • 题解:UVA124 Following Orders
    考虑深搜和拓扑排序。从入度为零的节点开始,逐步添加到当前的排列结果中,并在每一步递减相邻节点的入度。如果某个节点的入度变为零,就递归地将其添加到当前排列中。一旦达到排列的叶节点,就存储起来,并按字典顺序排序。代码:#include<bits/stdc++.h>usingnamespacestd;voidread......
  • 题解:UVA117 The Postal Worker Rings Once
    此题要求我们求欧拉回路的长度。使用Floyd算法计算图中任意两点之间的最短路径,对于度数为奇数的路口(最多有两个),找到它们之间的最短路径并将其加入总路径长度中。代码:#include<bits/stdc++.h>#defineINF1e8usingnamespacestd;intdegree[26];intpath[26][26];intal......
  • 题解:SP15553 STC00 - Hamsters
    首先,通过预处理计算每个名字的哈希值,然后利用哈希检查名字之间的最长公共前缀,从而确定从一个名字转移到另一个名字的最小代价。使用倍增动态规划计算转移的最小成本,\(f_{t,i,j}\)表示从名字\(i\)经过\(2^t\)步转移到名字\(j\)的最小代价,最后通过位运算处理\(M\)次转移的......
  • 题解:AT_abc373_d [ABC373D] Hidden Weights
    可以发现一个性质:对于图的每个连通分量,一旦在其中任何顶点上的值固定,则所有写入的值都是确定的。我们可以逐个DFS每个连通分量,按照题目的要求给每个点赋值,初始搜索的点值设成\(0\)即可。代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;......
  • 题解:SP19382 STK - Stock
    一道动态规划题。先分析状态。\(dp_{i\operatorname{and}1,k}\):表示在第\(i\)天最多进行\(k\)次交易的最大利润。\(s_{i\operatorname{and}1,k}\):表示在第\(i\)天之前的某天卖出之后,最多进行\(k-1\)次交易的最大利润减去当天的价格。接下来分析转移方程当\(i=0\)......
  • 题解:SP23875 DCEPC14A - Another Version of Inversion
    我们注意到这道题是二维的,所以要用到二维树状数组,不会的可以看一下这篇文章。这题的思路和P1908很像,按价值从大到小排序,排完序之后用树状数组维护,每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大,然后在查询当前这个数前面位置的数(是前面位......