Codeforces Round 115 (Div. 2 A/C)

A. Computer Game

传送门

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

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

传送门

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

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

样例解释

在这里插入图片描述


题目大意: 从一个数组中删去两个数,使其平均值(可能为小数)不变,问有几种删法。

经过一番数学推理之后,可直接获得等式 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;
}

猜你喜欢

转载自blog.csdn.net/laysan/article/details/120740701