Educational Codeforces Round 115 (Rated for Div. 2) A-D

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,明天和一个并查集一起尝试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值