A题

题目链接

题意及思路

  • 题意:给定两个正整数数组,从两数组中分别挑选一个出来,使得两数之和不属于定两数组。
  • 思路:sort一下,然后取两数组的最大值即可。

代码

#include<bits/stdc++.h>

using namespace std;

const int N = 105;
int a[N],b[N];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin >> n;
    for(int i=0;i<n;i++) cin >> a[i];
    cin >> m;
    for(int i=0;i<m;i++) cin >> b[i];

    sort(a,a+n);
    sort(b,b+m);

    cout << a[n-1] << " " << b[m-1] << endl;

    return 0;
}

B题

题目链接

题意及思路

  • 题意:使得给定一串数的乘积为1,只可以对某数进行+1、-1操作,很好的是可以无限次对一个数进行操作,求最少操作次数。(给定的数都为整数)
  • 思路:直接的想法是,开三个数组,分别正数、负数和0(当然0可以只计数)。考虑三种情况,第一种情况是负数能够自给自足(即负数是偶数,乘积为正数),或者含有0(这样可以补负数,即0-1=-1,如果还有0就可以变成1)。第二种情况是,在前面情况不满足的情况下,含有正数。第三种情况是,在不满足前面的情况下,即只有负数且负数不成对。后面两种情况,可以自己想想,实现见代码。

代码

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5+5;
int pn=0,zn=0,nn=0;
int pos[N],zero[N],nag[N];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    int n,x;
    cin >> n;
    for(int i=0;i<n;i++){
        cin >> x;
        if(x>0) pos[pn++] = x;
        else if(x<0) nag[nn++] = x;
        else zero[zn++] = x;
    }

    long long ans = 0;
    if(nn%2==0 || zn>0){
        for(int i=0;i<pn;i++) ans += (pos[i]-1);
        for(int i=0;i<nn;i++) ans += (-1-nag[i]);
        ans += zn;
    }else if(pn>0){
        sort(pos,pos+pn);
        ans += (pos[0]+1);
        for(int i=1;i<pn;i++) ans += (pos[i]-1);
        for(int i=0;i<nn;i++) ans += (-1-nag[i]);
    }else{
        sort(nag,nag+nn);
        ans += (1-nag[0]);
        for(int i=1;i<nn;i++) ans += (-1-nag[i]);
    }
    cout << ans << endl;

    return 0;
}

C题

题目链接

题意及思路

  • 题意:
  • 思路:

代码

#include<bits/stdc++.h>

using namespace std;

const int N = 2e5+5;
int q[N];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    int n,cnt=0;
    cin >> n;

    if(n%2!=0){
        cout << "YES" << endl;
        int val = 1,idx = 0;
        q[idx] = val++; cnt++;
        while(cnt<=2*n){
            idx = (idx+n)%(2*n);
            q[idx] = val++;
            if(val>2*n) break;
            idx = (idx+1)%(2*n);
            q[idx] = val++;
            cnt += 2;
        }
        for(int i=0;i<2*n;i++){
            cout << q[i];
            if(i!=2*n-1) cout << " ";
        }
        cout << endl;
    }else cout << "NO" << endl;

    return 0;
}