【紀中2020.4.29日】模擬賽題解

目錄:

T1:The Great Revegetation
T2:Measuring Traffic
T3:MooBuzz
T4:Milk Visits

老USACO了……

正題:

T1:The Great Revegetation

題目描述

長時間的乾旱使得Farmer John的N塊草地上牧草匱乏。隨着雨季即將到來,現在應當是重新種植的時候了。
在Farmer John的儲物棚裏有四個桶,每個桶裏裝着一種不同的草種。他想要在每塊草地上播種其中一種草。作爲一名奶農,Farmer John想要確保他的每頭奶牛都能得到豐富的食譜。他的M頭奶牛每一頭都有兩塊喜愛的草地,他想要確保這兩塊草地種植不同種類的草,從而每頭奶牛都可以有兩種草可供選擇。Farmer John知道沒有一塊草地受到多於3頭奶牛的喜愛。
請幫助Farmer John選擇每塊草地所種的草的種類,使得所有奶牛的營養需求都得到滿足。

輸入

輸入的第一行包含N(2≤N≤100)和M(1≤M≤150)。以下M行,每行包含兩個範圍爲1…N的整數,爲Farmer John的一頭奶牛喜歡的兩塊草地。

輸出

輸出一個N位數,每一位均爲1…4之一,表示每一塊草地上所種的草的種類。第一位對應草地1的草的種類,第二位對應草地2,以此類推。如果有多種可行的解,只需輸出所有解中最小的N位數。

樣例輸入

5 6
4 1
4 2
4 3
2 5
1 2
1 5

樣例輸出

12133

分析:

暴力枚舉
然後輸出當前情況
標記結束循環

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
	freopen("revegetate.in","r",stdin);
	freopen("revegetate.out","w",stdout);
    int n,m;
    int a[151],b[151],g[101];
    cin>>n>>m;
    for(int i=0;i<m;i++) { 
    	cin>>a[i]>>b[i];
    	if(a[i]>b[i]) swap(a[i],b[i]);  //大小區分,方便後面判斷
   }
    for(int i=1;i<=n;i++){
        int k;
    	for(k=1;k<=4;k++){ //枚舉
        bool f=true;
        for(int j=0;j<m;j++){
        	if(b[j]==i&&g[a[j]]==k){  //編號相同,數值相同
        		f=false;
        }
    }
    	if(f) break;  //停止
    }
    	g[i]=k;  //存入  
    	cout<<k;
    }
    return 0;
}

T2:Measuring Traffic

題目描述

Farmer John的農場邊上的高速公路最近出現了引人注目的流量上升,或者至少Farmer John看起來是這樣的。爲了證實這件事,他打算用一組傳感器測量公路上的車流量,每個傳感器被用來測量一小段路面上的車流量的數值。
不幸的是,某一天經過牛棚的時候,Farmer John被絆倒了,裝有傳感器的盒子掉進了一個巨大的奶缸,之後它們就不能正常工作了。比起之前可以產生一個精確的車流量讀數,現在每個傳感器只能輸出一個可能結果的範圍。例如,一個傳感器可能會給出範圍[7,13],表示在這段路面上的車流量不小於7,並且不大於13。
高速公路經過農場的這一段長N英里,車輛僅從一個方向通過公路,從第1英里駛向第N英里。Farmer John想要安裝N個傳感器——每一個監測高速公路上1英里長的路段。在其中某些路段上,有能夠使得車輛進入高速公路的上匝道;在所有這樣的路段上,Farmer John會將傳感器裝在上匝道上,測量流入的(近似)車流量。在某些路段上有能夠使得車輛離開高速公路的下匝道;在所有這樣的路段上,Farmer John會將傳感器裝在下匝道上。每一個路段包含至多一個匝道。如果在公路的一個路段上沒有上匝道或下匝道,Farmer John就將傳感器裝在高速公路的主路上。
給定Farmer John的N個傳感器的讀數,請求出在高速公路第1英里之前和第N英里之後車流量的最爲準確的可能範圍。這些範圍應當與所有N個傳感器的讀數相一致。

輸入

輸入的第一行包含N(1≤N≤100)。餘下N行每行按從第1英里至第N英里的順序描述一段1英里長的路段。每行包含一個字符串,爲"on"(如果這段路上有一個上匝道),“off”(如果這段路上有一個下匝道),或者是"none"(如果這段路上沒有匝道),然後是兩個範圍爲0…1000的整數,表示這段路上的傳感器的讀數所給出的下界、上界。如果這段路上包含匝道,傳感器讀數來自於匝道,否則來自於主路。至少一個高速公路路段的描述會是"none"。

輸出

輸出的第一行包含兩個整數,爲第1英里之前的車流量的最準確的可能範圍。第二行包含兩個整數,爲第N英里之後的車流量的最準確的可能範圍。輸入保證存在符合要求的解。

樣例輸入

4
on 1 1
none 10 14
none 11 15
off 2 3

樣例輸出

10 13
8 12

分析:

做兩遍
分三種情況
none 用來取範圍
on 意爲進車 也就是做加法
off 意爲放車 也就是做減法

CODE:

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
int m,n;
struct node{
	string f;
	int x,y;
}a[1001000];
int main(){
	freopen("traffic.in","r",stdin);
	freopen("traffic.out","w",stdout);
	int l=0,r=1000100;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].f>>a[i].x>>a[i].y;
		if(a[i].f=="none"){  //取範圍
			l=max(l,a[i].x);
			r=min(r,a[i].y);
		}
		if(a[i].f=="on"){  //加法
			l+=a[i].x;
			r+=a[i].y;
		}
		if(a[i].f=="off"){  //減法
			l-=a[i].y;
			r-=a[i].x;
		}
		l=max(l,0);
	}
	int l2=0,r2=1000010;
	for(int i=n;i>=1;i--){  //同理,反着來做第二遍
		if(a[i].f=="none"){
			l2=max(l2,a[i].x);
			r2=min(r2,a[i].y);
		}
		if(a[i].f=="on"){
			l2-=a[i].y;
			r2-=a[i].x;
		}
		if(a[i].f=="off"){
			l2+=a[i].x;
			r2+=a[i].y;
		}
		l2=max(l2,0);
	}
	cout<<l2<<' '<<r2<<endl<<l<<' '<<r;
	return 0;
}

T3:MooBuzz

題目描述

Farmer John 的奶牛們最近成爲了一個簡單的數字遊戲“FizzBuzz”的狂熱玩家。這個遊戲的規則很簡單:奶牛們站成一圈,依次從一開始報數,每頭奶牛在輪到她的時候報一個數。如果一頭奶牛將要報的數字是 3 的倍數,她應當報“Fizz”來代替這個數。如果一頭奶牛將要報的數字是 5 的倍數,她應當報“Buzz”來代替這個數。如果一頭奶牛將要報的數字是 15 的倍數,她應當報“FizzBuzz”來代替這個數。於是這個遊戲的開始部分的記錄爲:
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16
由於詞彙的匱乏,奶牛們玩的 FizzBuzz 中用“Moo”代替了 Fizz、Buzz、FizzBuzz。於是奶牛版的遊戲的開始部分的記錄爲:
1, 2, Moo, 4, Moo, Moo, 7, 8, Moo, Moo, 11, Moo, 13, 14, Moo, 16
給定 N(1≤N≤10^9),請求出這個遊戲中第 N 個被報的數。

輸入

輸入包含一個整數 N。

輸出

輸出遊戲中被報出的第 N 個數。

樣例輸入

4

樣例輸出

7

分析:

很明顯是週期問題
15爲一個週期 用一個數組存下15內不是“Moo”的數
累加週期位數

CODE:

#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
int a[9]={14,1,2,4,7,8,11,13};  //15內非Moo的數
int n,x,ans; 
int main(){
	freopen("moobuzz.in","r",stdin);
	freopen("moobuzz.out","w",stdout);
	scanf("%d",&n);
	x=n/8;
	ans=x*15;
	if(n%8!=0) ans+=a[n%8];  //累加週期位數
	else ans--;  //直接ans--即可
	printf("%d",ans);
return 0;
}

T4:Milk Visits

題目描述

Farmer John 計劃建造 N(1≤N≤10^5)個農場,用 N−1 條道路連接,構成一棵樹(也就是說,所有農場之間都互相可以到達,並且沒有環)。每個農場有一頭奶牛,品種爲更賽牛或荷斯坦牛之一。
Farmer John 的 M 個朋友(1≤M≤10^5)經常前來拜訪他。在朋友 i 拜訪之時,Farmer John 會與他的朋友沿着從農場 Ai 到農場 Bi 之間的唯一路徑行走(可能有 Ai=Bi)。除此之外,他們還可以品嚐他們經過的路徑上任意一頭奶牛的牛奶。由於 Farmer John 的朋友們大多數也是農場主,他們對牛奶有着極強的偏好。他的有些朋友只喝更賽牛的牛奶,其餘的只喝荷斯坦牛的牛奶。任何 Farmer John 的朋友只有在他們訪問時能喝到他們偏好的牛奶纔會高興。
請求出每個朋友在拜訪過後是否會高興。

輸入

輸入的第一行包含兩個整數 N 和 M。
第二行包含一個長爲 N 的字符串。如果第 i 個農場中的奶牛是更賽牛,則字符串中第 i 個字符爲 ‘G’,如果第 i 個農場中的奶牛是荷斯坦牛則爲 ‘H’。
接下來下 N−1 行,每行包含兩個不同的整數 X 和 Y(1≤X,Y≤N),表示農場 X 與 Y 之間有一條道路。
接下來下 M 行,每行包含整數 Ai,Bi,以及一個字符 Ci。Ai 和 Bi 表示朋友 i 拜訪時行走的路徑的端點,Ci 是 ‘G’ 或 ‘H’ 之一,表示第 i 個朋友喜歡更賽牛的牛奶或是荷斯坦牛的牛奶。

輸出

輸出一個長爲 M 的二進制字符串。如果第 i 個朋友會感到高興,則字符串的第 i 個字符爲 ‘1’,否則爲 ‘0’。

樣例輸入

5 5
HHGHG
1 2
2 3
2 4
1 5
1 4 H
1 4 G
1 3 G
1 3 H
5 5 H

樣例輸出

10110

分析:

並查集模板 好像要用快讀

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){  //快讀
	int s=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='H'||c=='G')return c;
		if(c=='-')f=-1;c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<1)+(s<<3)+(c^48);c=getchar();
	}
	return f*s;
}
int n,m,b[100001];
char c[100001];
int find(int x){
	if(b[x]!=x){
		b[x]=find(b[x]);  //也就是getfather函數
	}
	return b[x];
}
int main(){
	freopen("milkvisits.in","r",stdin);
	freopen("milkvisits.out","w",stdout);
	n=read(),m=read();
	scanf("%s",c+1);
	for(int i=1;i<=n;i++)b[i]=i;
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		if(c[x]==c[y])b[find(x)]=find(y);  //並查集模板
	}
	for(int i=1;i<=m;i++){
		int x=read(),y=read(),z=read();
		printf("%d",find(x)!=find(y)||c[x]==z);  //可直接輸出表達式運算結果真假
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章