2020程序设计竞赛-现场赛题解

以下是2020程序设计竞赛现场赛题解:

在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int mod = 1e9 + 7;

ll n;

ll Pow(ll x, int k)
{
	ll ans = 1, base = x;
	while(k)
	{
		if(k & 1) ans = ans * base % mod;
		base = base * base % mod;
		k >>= 1;
	}
	return ans;
}

int main()
{
	scanf("%lld", &n); n %= mod;
	printf("%lld\n", (n + 2) * (n + 1) % mod * n % mod * Pow(6, mod - 2) % mod);
	return 0;
}

在这里插入图片描述

#include <iostream>
#include <map>
using namespace std;
map<long long,long long> glo;
int main()
{
    int n,ans;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        glo[x]++;
        if(glo[x]%2 == 1)
            ans = x;
    }
    cout<<ans<<endl;
    return 0;
}

还有一种方法是采用 &=(按位与后赋值)

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

const int maxn=2e6;
int n,a,sum;

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a;
		sum^=a;
	}
	cout<<sum<<endl;
    return 0;
}

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int main()
{
    long long n,cnt = 0;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=2;i<=n;i++){
        if(a[i-1] == 0 && a[i] == 1)
            cnt++;
    }
    cout<<cnt+1<<endl;
    return 0;
}

在这里插入图片描述
在这里插入图片描述

#include <cstdio>
#include <iostream>

using namespace std;
typedef long long ll;
const ll mod=23333333333333333;
int t;
ll n;
ll p;
int main(){
//	freopen("E://AcmData//1.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		scanf("%lld",&n);
		p=n;
		printf("%lld\n",(p+1)*p/6%mod);
	}
	return 0;
} 

在这里插入图片描述
(DFS数字排列问题)

#include<bits/stdc++.h>
using namespace std;
const int N=30;
int isp[N<<1],n,a[N],vis[N],ans;
void init(){
    for(int i=2;i<30;i++) if(!isp[i])
        for(int j=i*i;j<30;j+=i) isp[j]=1;
}
void dfs(int pos){
    if(pos==n+1){
        if(!isp[a[n]+a[1]]){
            ans++;
            //printf("%d",a[1]);
            //for(int i=2;i<=n;i++) printf(" %d",a[i]);
            //puts("");
        }
        return;
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]&&!isp[i+a[pos-1]]){
            //cout<<pos<<" "<<i<<endl;
            vis[i]=1,a[pos]=i,dfs(pos+1),vis[i]=0;
        }
    }
}
int main(){
    init(),scanf("%d",&n);
    vis[1]=1,a[1]=1,dfs(2);
    printf("%d\n",ans);
    return 0;
}

在这里插入图片描述

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

int main()
{
    int n;
    cin>>n;
    int cnt = 0;
    for(int i=1;i*i<=n;++i){
        if(i*i<=n) cnt++;
    }
    cout<<cnt<<endl;
    return 0;
}

在这里插入图片描述

//本场的防AK题目 原题牛客挑战赛第三场题目   题目名称:位数差
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000011;
int n,a[maxn],t[maxn],A[maxn];
void Ins(int x){
    for (x=n-x+1;x<=n;x+=x&-x) ++t[x];
}
int Query(int x){
    if (x>n) return 0;
    int ans=0;
    for (x=n-x+1;x;x-=x&-x) ans+=t[x];
    return ans;
}
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;++i) scanf("%d",a+i);

    static int w[maxn];
    for (int i=1;i<=n;++i) w[i]=a[i];
    sort(w+1,w+n+1);
    for (int i=1;i<=n;++i) A[i]=lower_bound(w+1,w+n+1,a[i])-w;

    long long ans=0;
    for (int i=n;i>=1;--i){
        for (int j=0;j<=100000000;j?j*=10:j=10)
            if (j>a[i]) ans+=Query(lower_bound(w+1,w+n+1,j-a[i])-w);
        Ins(A[i]);
    }
    printf("%lld\n",ans);
}

在这里插入图片描述

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--){
        int x1 = 0,y1 =0,r1=0,x2=0,y2=0,r2=0;
        double d=0.0;
        cin>>x1>>y1>>r1>>x2>>y2>>r2;
        d = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
        if((r1+r2)>=d && ((abs(r1-r2))<=d)){
            cout<<"yes"<<endl;
        }
        else
            cout<<"no"<<endl;
    }
    return 0;
}

在这里插入图片描述
解法1

#include <bits/stdc++.h>
using namespace std;
int flag = 0;
int main(){
    string a,b;
    cin>>a>>b;
    int lena = a.size(),lenb = b.size();
    for(int i=0;i<=lena-lenb;i++){
        if(a.substr(i,lenb) == b){
                flag = 1;
            break;
        }
    }
    if(flag) cout<<"YES";
    else cout<<"NO";
    return 0;
}

解法2

#include <iostream>
#include <string>
using namespace std;
int main(){
    string a,b;
    cin>>a>>b;
    int j=0;
    for(int i=0;i<a.size();i++){
        if(a[i]==b[j]){
            j++;
        }
        if(j==b.size()){
                    cout<<"Yes";
                    return 0;
                }
    }
    cout<<"No";

    return 0;
}

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
int a[10];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
            int x;
        cin>>x;
        if(x == 1)
            a[1]++;
        else if(x==2)
            a[2]++;
        else
            a[3]++;
    }
    int maxx = a[1];
    for(int i=2;i<=3;i++){
        if(a[i]>maxx) maxx = a[i];
    }
    cout<<n-maxx;
    return 0;
}

未完待续。。。

小伙伴们,欢迎加入我的友链,我们一起共同学习,共同进步?:
我的友链: https://acmic.top/links/

以上属个人见解。
❤️希望对您有帮助,您的支持是我创作最大的动力!

推荐你可能喜欢的其他精彩内容:
CDN是什么?一分钟带你了解CDN
【Linux学习】CentOS6.8安装步骤的详细教程
第十届蓝桥杯大赛软件类省赛C/C++大学B组 题解
Windows10下利用DOSBOX和MASM32搭建汇编语言环境
最新Chromedriver与Chrome版本对应参照表【附下载链接】


版权声明:本文为weixin_45532870原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。