天天看點

Codeforces Round 115 (Div. 2 A/C)

A. Computer Game

傳送門

題目描述

Codeforces Round 115 (Div. 2 A/C)

輸入描述

Codeforces Round 115 (Div. 2 A/C)

輸出描述

Codeforces Round 115 (Div. 2 A/C)

輸入樣例

4
3
000
000
4
0011
1100
4
0111
1110
6
010101
101010
           

輸出樣例

YES
YES
NO
YES
           

題目大意: 某遊戲中共有兩條道路,其中 1 表示障礙,0 表示可通過。每次可以橫、縱、斜向移動一格,判斷玩家是否能夠從左上角移動到右下角。

顯然,當某列兩行都為 1 時無論如何都不能通過,枚舉即可。

參考代碼

#include <bits/stdc++.h>
using namespace std;

int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		int flag=1;
		string a,b;
		cin>>a>>b;
		for(int i=0;i<n;i++){
			if(a[i]=='1'&&b[i]=='1'){
				cout<<"NO"<<endl;
				flag=0;
				break;
			}
		}
		if(flag==1)
			cout<<"YES"<<endl;
	} 
	return 0;
}
           

C. Delete Two Elements

傳送門

題目描述

Codeforces Round 115 (Div. 2 A/C)

輸入描述

Codeforces Round 115 (Div. 2 A/C)

輸出描述

Codeforces Round 115 (Div. 2 A/C)

輸入樣例

4
4
8 8 8 8
3
50 20 10
5
1 4 7 3 5
7
1 2 3 4 5 6 7
           

輸出樣例

6
0
2
3
           

樣例解釋

Codeforces Round 115 (Div. 2 A/C)

題目大意: 從一個數組中删去兩個數,使其平均值(可能為小數)不變,問有幾種删法。

經過一番數學推理之後,可直接獲得等式 2 * sum = n ( x + y ) ;其中 sum 為原數組中所有元素之和,n 為元素個數,x、y 為符合要求将删去的數。

由于 x、y 都為整數,是以若 2 * sum / n 的餘數不為 0 時,答案為 0;

當餘數為 0 時,則符合要求的 x、y 相加後即為上述式子的商,在輸入數組時用 map 标記個數即可。若 x = y,需要注意特判。

參考代碼

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=2e5+10;
int a[N];

int main(){
	int t;
	cin>>t;
	while(t--){
		int n,x;
		ll ans=0,sum=0;
		map<int,ll> mp;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>x;
			a[i]=x;
			mp[x]++;
			ans+=x;
		}
		if((2*ans)%n!=0){
			cout<<"0"<<endl;
			continue;
		}
		ans=(2*ans)/n;
		sort(a+1,a+n+1);
		for(int i=1;i<=n;i++){
			if(mp[a[i]]!=0&&mp[ans-a[i]]!=0){
				if((2*a[i])==ans)
					sum=sum+mp[a[i]]*(mp[a[i]]-1)/2;
				else
					sum=sum+mp[a[i]]*mp[ans-a[i]];
				mp[a[i]]=mp[ans-a[i]]=0;
			}
		}
		cout<<sum<<endl;
		
	}
	
	
	return 0;
}
           

繼續閱讀