【纪中2020.4.08日】模拟赛题解

目录:

T1:Social Distancing 1
T2:Social Distancing 2
T3:Cowntact Tracing

“Social Distancing”即“社会距离”标题就深刻说明这次防疫需要保持距离,不密切接触。实在是

正题:

T1:Social Distancing 1

题目描述

一种新型疾病,COWVID-19,开始在全世界的奶牛之间传播。Farmer John 正在采取尽可能多的预防措施来防止他的牛群被感染。
Farmer John 的牛棚是一个狭长的建筑物,有一排共 N 个牛栏(2≤N≤10^5)。有些牛栏里目前有奶牛,有些目前空着。得知“社交距离”的重要性,Farmer John 希望使得 D 尽可能大,其中 D 为最近的两个有奶牛的牛栏的距离。例如,如果牛栏 3 和 8 是最近的有奶牛的牛栏,那么 D=5。
最近两头奶牛新来到 Farmer John 的牛群,他需要决定将她们分配到哪两个之前空着的牛栏。请求出他如何放置这两头新来的奶牛,使得 D 仍然尽可能大。Farmer John 不能移动任何已有的奶牛;他只想要给新来的奶牛分配牛栏。

输入

输入的第一行包含 N。下一行包含一个长为 N 的字符串,由 0 和 1 组成,描述牛棚里的牛栏。0 表示空着的牛栏,1 表示有奶牛的牛栏。字符串中包含至少两个 0,所以有至少有足够的空间安置两头新来的奶牛。

输出

输出 Farmer John 以最优方案在加入两头新来的奶牛后可以达到的最大 D 值(最近的有奶牛的牛栏之间的距离)。

样例输入

14
10001001000010

样例输出

2

分析:

四种情况判断:
1.把2个1放在两个不同的区间
2.把2个1放在同一个区间
3.把2个1分别放在头和尾
4.区间输出

CODE:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,maxn1,maxn2,x,y,maxx=2147483647;
int a[100101],cnt;
char c;
int main()
{
	freopen("socdist.in","r",stdin);
	freopen("socdist.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		if(c=='1')
		{
			m++,a[m]=i;
			if(m>1)
		 	{
				maxx=min(maxx,a[m]-a[m-1]);
				if(a[m]-a[m-1]>=maxn1)
				{
					maxn2=maxn1;
					maxn1=a[m]-a[m-1];
				}
				else
					maxn2=max(maxn2,a[m]-a[m-1]);
			}
		}
	}
	x=min(maxn1/2,maxn2/2),y=maxn1/3;
	if(a[1]>1)  //分别判断
	{
		x=max(x,min(a[1]-1,maxn1/2));
		y=max(y,(a[1]-1)/2);
	}
	if(a[m]<n)
	{
		x=max(x,min(n-a[m],maxn1/2));
		y=max(y,(n-a[m])/2);
	}
	if(a[1]>1&&a[m]<n)
		cnt=min(a[1]-1,n-a[m]);
	if(m==0)
		cout<<n-1;
	else
		cout<<min(maxx,max(x,max(y,cnt)));
	return 0;
}

T2:Social Distancing 2

题目描述

由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。
尽管他尽了最大努力使他的 N 头奶牛们(1≤N≤1000)践行“社交距离”,还是有许多奶牛不幸染上了疾病。编号为 1…N 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 i 位于位置 xi。Farmer John 知道存在一个半径 R,任何与一头被感染的奶牛距离不超过 R 单位的奶牛也会被感染(然后会传染给与其距离 R 单位内的奶牛,以此类推)。
不幸的是,Farmer John 并不确切知道 R 的值。他只知道他的哪些奶牛被感染了。给定这个数据,求出起初感染疾病的奶牛的最小数量。

输入

输入的第一行包含 N。以下 N 行每行用两个整数 x 和 s 描述一头奶牛,其中 x 为位置(0≤x≤10^6),s 为 0 表示健康的奶牛,1 表示染病的奶牛,并且所有可能因传播而染病的奶牛均已染病。

输出

输出在疾病开始传播之前已经得病的奶牛的最小数量。

样例输入

6
7 1
1 1
15 1
3 1
10 0
6 1

样例输出

3

分析:

这道题在T1的基础上做出了改变……
实际上求出每个被感染的牛与离它最近的一头被感染的牛之间的距离就好了
注意开long long

CODE:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
long long n,f[1000001],x,y,minn=2147483647,maxx,ans;
int main()
{
	freopen("socdist2.in","r",stdin);
	freopen("socdist2.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{		
		scanf("%d%d",&x,&y);
		maxx=max(maxx,x);
		if(!y) f[x]=1;  //标记
		else   f[x]=2;
	}
	x=1100000,y=2200000;
	for(int i=1;i<=maxx;i++)
	{
		minn=min(minn,abs(x-y)-1);  //距离
		if(f[i]==1) y=i;
		if(f[i]==2) x=i;  //记录
	}
	minn=min(minn,abs(x-y)-1);x=-1;
	for(int i=1;i<=maxx;i++) 
		if(f[i]==2) 
		{
			if(i>x) ans++;  //计数
			x=i+minn;
		}
	printf("%d\n",ans);
	return 0;
}

T3: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

待补档……

猜你喜欢

转载自blog.csdn.net/dgssl_xhy/article/details/106045865