A - Computer Game
算法:无
解决方法:暴力
解决思路:不存在有一列全是1就好
注意点:数组用char类型
#include <bits/stdc++.h>
using namespace std;
char cell[2][200];
int main()
{
int t;
//freopen("in.txt","r",stdin);
bool falg=true;
for(cin>>t;t;t--)
{
int n;
falg=true;
cin>>n;
for(int i=0;i<2;i++)
{
for(int j=0;j<n;j++)
{
cin>>cell[i][j];
}
}
for(int i=0;i<n;i++)
{
if(cell[0][i]==cell[1][i]&&cell[0][i]=='1')
{
cout<<"NO"<<endl;
falg=false;
break;
}
}
if(falg)
cout<<"YES"<<endl;
}
return 0;
}
B - Groups
算法:无
解决方法:暴力
解决思路:只要有两列数满足两点要求就好
1.两列数的1的数量都要大于等于n/2
2.两列数的1的是互补的也就是说单拿出这两列放在一起组成一个n行2列的二维数组后这个二维数组不存在有一行全为0
注意点:遍历操作
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
int n;
bool no=1;
int a[2000][5];
//freopen("in.txt","r",stdin);
for(cin>>t;t;t--)
{
no=1;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<5;j++)
{
cin>>a[i][j];
}
}
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(j==i)
continue;//遍历同一排是无效的
int con1=0,con2=0,total=0;
for(int k=0;k<n;k++)
{
con1+=a[k][i];
con2+=a[k][j];
total+=max(a[k][i],a[k][j]);
}
if(con1>=n/2&&con2>=n/2&&total==n)
{
no=0;
}
}
}
if(no)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
C - Delete Two Elements
算法:无,可能用到了数学
解决方法:公式推导
解决思路:得到了a[i]和能和他配对的x的关系利用key-value对应的map来做
注意点:不要用暴力,会超时(test7)
#include <bits/stdc++.h>
#define maxn 1000000
using namespace std;
int t;
int n;
long long a[maxn];
map<long long,int> m;
int main()
{
cin>>t;
while(t--)
{
m.clear();
cin>>n;
long long s=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
s=s+a[i];
}
long long ans=0;
for(int i=0;i<n;i++)
{
ans=ans+m[a[i]*n];
m[2*s-a[i]*n]+=1;
}
cout<<ans<<endl;
}
return 0;
}
D - Training Session
算法:无,用到了高中数据的排列组合
解决方法:公式推导
解决思路:n个问题任取三个组成题集,总数C(n,3),然后排除所有不符合题目中两个要求的题集
#include<bits/stdc++.h>
using namespace std;
int main() {
long long t,n;
int u,v;
long long a[200010],b[200100],sa[200020],sb[200010];
for(cin>>t;t;t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d %d",&v,&u);
sa[u]+=1;
sb[v]+=1;
a[i]=u;
b[i]=v;
}
long long ans=n*(n-1)*(n-2)/6;
for(int i=0;i<n;i++)
{
ans=ans-(sa[a[i]]-1)*(sb[b[i]]-1);
}
cout<<ans<<endl;
for(int i=1;i<=n;i++)
{
sa[i]=0;
sb[i]=0;
}
}
return 0;
}
画个重点,这题我没见过尤其是
ans=ans-(sa[a[i]]-1)*(sb[b[i]]-1);
看大佬的代码写的
E题是DP,明天和一个并查集一起尝试一下。