2020.4.08 C组模拟赛题解
目錄:
T1:Social Distancing 1 T2:Social Distancing 2 T3:Cowntact Tracing正題:
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];}elsemaxn2=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;elsecout<<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待補檔……
總結
以上是生活随笔為你收集整理的2020.4.08 C组模拟赛题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用pandas的话,如何直接删除这个表
- 下一篇: vos3000外呼系统讯时O口网关加密注