【紀中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

待補檔……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章