Codeforces Round 618 A-D题解

比赛链接:

A题

题解:

直接统计0的个数和所有数的和,如果0的个数加上总和等于0,表示我们处理把0都变成0之外,还需要在一个正数上额外再加1 。

代码实现:

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
int a[105];
int main(){
    int t,n;
    cin>>t;
    while(t--){
        cin>>n;
        int sum=0,flag=0;
        rp(i,1,n){
            cin>>a[i],sum+=a[i];
            if(a[i]==0) flag=1;
        } 
        // sort(a+1,a+1+n);
        if(sum==0&&!flag) cout<<1<<endl;
        else{
            int cnt=0;
            rp(i,1,n)
                if(a[i]==0) 
                    cnt++;
            if(cnt+sum==0) cout<<cnt+1<<endl;
            else cout<<cnt<<endl;
        }
    }   
    return 0;
}

B题

排序后直接输出中间两个数的差值就行了。

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
const int N = 2e5+7;
int a[N];
int main(){
    int T=read();
    while(T--){
        int n=read();
        rp(i,1,2*n) a[i]=read();
        sort(a+1,a+1+2*n);
        printf("%d\n",abs(a[n+1]-a[n]));
    }
    return 0;
}

C题

题解:

我们可以通过打表退出一个规律,每次只需要把每个数转换二进制,然后统计一下所有位中,只有一个一的位置的数,

最后先把这个位置的数输出就行,其他输出顺序不变。

代码实现:

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
const int N = 1e5+7;
int a[N],pre[N],last[N];
int main(){
    int n=read();
    rp(i,1,n) a[i]=read();
    int pos=-1;
    RP(i,32,0){
        int cnt=0;
        rp(j,1,n)
            if((a[j]<<i)&1)
                cnt++,pos=j;
        if(cnt==1) break;
    }
    cout<<a[pos]<<" ";
    rp(i,1,n){
        if(i==pos) continue;
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}
/*
4   0   11  6
100 0 1011 110
11 6 4 0  11 4 0 6
1011 110 100 0
1011 100 110 0
*/

D题

题解:可以推出一个规律,如果这个凸包是一个中心对称图形且点数为偶数,那么输出YES,否则输出NO

然后我们可以求出中心点,然后在枚举每个点,判断是否存在与之中心对称的另一个点。

代码实现:

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
const int N = 1e5+7;
map<pair<ll,ll>,int> H;
int n;
ll x[N],y[N];
int main(){
    int n=read();
    ll midX=0,midY=0;
    rp(i,1,n){
        x[i]=read(),y[i]=read();
        x[i]*=n,y[i]*=n;
        midX+=x[i];
        midY+=y[i];
        H[mp(x[i],y[i])]=1;
    } 
    midX/=n,midY/=n;
    rp(i,1,n){
        if(H[mp(2*midX-x[i],2*midY-y[i])]==0){
            cout<<"NO"<<endl;
            return 0;
        }
    }
    cout<<"YES"<<endl;
    return 0;
}
发布了342 篇原创文章 · 获赞 220 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43472263/article/details/104298452