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;
}