Codeforces Round #563 (Div. 2) A-D

A:
   将2*n个数进行排序,然后检验一下前面n个和 后面n个和是否相同。

AC_code

int n;
int a[2100];
int main() {
    scanf("%d",&n);
    for(int i =0;i<2*n;i++) scanf("%d",&a[i]);
    sort(a,a+2*n);
    int sum = 0;
    for(int i = 0;i<n;i++) sum+=a[i];
    for(int i = n;i<2*n;i++) sum-=a[i];
    if(sum!=0) {
        for(int i = 0;i<2*n;i++) {
            cout<<a[i];
            if(i != 2*n-1) cout<<' ';
            else cout<<endl;
        }
    }
    else cout<<"-1"<<endl;
    return 0;
}

B:
   很明显如果没有奇数或者偶数,我们的序列肯定是不能进行变化的,但如果同时存在奇数和偶数,可以证明的是我们能通过有限次变换将序列变成任意一种形式,这时候我们只要sort一下就能保证字典序最小啦。

AC_code

int n;
int a[100050];
int main() {
    int odd=0,even =0;
    scanf("%d",&n);
    for(int i = 0;i<n;i++) {
        scanf("%d",&a[i]);
        if(a[i] %2 ==0) even++;
        else odd++;
    }
    if(even == 0 || odd == 0) {
        for(int i=0;i<n;i++) {
            cout<<a[i];
            if(i == n-1) cout<<endl;
            else cout<<' ';
        }
    }
    else {
        sort(a,a+n);
        for(int i=0;i<n;i++) {
            cout<<a[i];
            if(i == n-1) cout<<endl;
            else cout<<' ';
        }
    }
    return 0;
}

C
   因为 i 为 j 如果互素, a[i] != a[j] , 所以 如果 j为质数 ,a[j] 的值肯定和前面任何数的值不同,我们用素数筛搞一下就好了.

AC_code

const int maxn = 1e5+7;
int n,now = 0;
int pr[maxn];
int main() {
    for(int i=2;i<maxn;i++) {
        if(pr[i] != 0) continue;
        pr[i] = ++now;
        for(long long j = 1ll*i*i;j<maxn;j+=i) {
            pr[j] = now;
        }
    }
    cin>>n;
    for(int i=2;i<=n;i++) {
        cout<<pr[i];
        if( i!=n) cout<<' ';
        else cout<<endl;
    }
    return 0;
}

D
   先转化成 求一个符合条件的前缀异或和数组 , 由条件可知 这个数组 不能有相同的数,并且不存在两个数的异或和为 x, 因为 对于一个数 m, 只存在一个数 q 有 q^m = x ,所以我们保证这两个数不在不同一个集合里就能避免这个问题了.

AC_code

const int maxn = 1e5+7;

int n;
int vis[262150];

std::vector<int> v[2];
int main() {
    int x;
    cin>>n>>x;
    int up = 1<<n;
    for(int i = 1;i<up;i++) {
        if( i == x) continue;
        vis[i] = vis[ x ^ i] ^ 1;
        v[vis[i]].push_back(i);
    }
    int ans = 1;
    if(v[0].size()>v[1].size()) {
        ans = 0;
    }
    int len = v[ans].size();
    cout<<len<<endl;
    sort(v[ans].begin(), v[ans].end());
    for(int i =0;i<len;i++) {
        if( i == 0) cout<< v[ans][i];
        else cout<< (v[ans][i] ^ v[ans][i-1]);
        if ( i != len -1) cout<<' ';
        else cout<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值