Codeforces Round #665 (Div. 2)A-C题解

A. Distance and Axis

题目:http://codeforces.com/contest/1401/problem/A

题解:对于n来说分两种情况,一是奇数,二则是偶数

①奇数:对于k来说如果是奇数且小于等于他,ans=0;若k是奇数并且大于n,则ans=k-n;若k是偶数并且k<n,那么ans=1;若k为偶数并且k>n,则ans=k-n

②偶数:若k为偶数并且k<=n,则ans=0;若k为偶数并且k>n,则ans=k-n;若k为奇数并且k<n,则ans=1;若k为奇数并且k>n,则ans=k-n

代码:

#include<bits/stdc++.h>    //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
//const int maxn = ;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;

int main()
{
    IOS;
    ll t,n,k;
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        if(n%2==0)
        {
            if(k%2==0&&k<=n)
                cout<<"0"<<endl;
            else if(k%2==0&&k>n)
                cout<<k-n<<endl;
            else if(k%2==1&&k<n)
                cout<<"1"<<endl;
            else if(k%2==1&&k>n)
                cout<<k-n<<endl;
        }
        else
        {
            if(k%2==0&&k<n)
                cout<<"1"<<endl;
            else if(k%2==0&&k>n)
                cout<<k-n<<endl;
            else if(k%2==1&&k<=n)
                cout<<"0"<<endl;
            else if(k%2==1&&k>n)
                cout<<k-n<<endl;
        }
    }
    return 0;
}

B. Ternary Sequence

题目:http://codeforces.com/contest/1401/problem/B

题解:若想最大,只有让尽可能多的a数组中的2去匹对b数组中的1,这样就都是正的。但也会存在负数,如何才能达到最大化呢?一道典型的贪心思路问题

首先判断a中2的个数是否大于b中1的个数

若大于b中1的个数,ans=2*y2,在判断a中0的个数和剩下的2的个数是否大于b数组中2的个数,若大于,答案还是ans;若小于,则b数组中剩下的2的个数将要和a数组中的1的个数进行配对,产生负数,则ans-=2*z2

若小于b中的1的个数,ans=2*z1,然后判断a中0的个数是否大于b中2的个数,若大于,答案就是ans;若小于,则b数组中剩下的2的个数将要和a数组中1的个数进行配对,产生负数,则ans-=2*z2

代码:

#include<bits/stdc++.h>    //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
//const int maxn = ;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;


int main()
{
    IOS;
    ll t,x1,x2,y1,y2,z1,z2;
    cin>>t;
    while(t--)
    {
        cin>>x1>>y1>>z1;
        cin>>x2>>y2>>z2;
        ll ans=0;
        if(z1>=y2)
        {
            ans+=2*y2;
            z1-=y2;
            if(x1+z1<z2)
            {
                z2=z2-(x1+z1);
                ans-=2*z2;
            }
        }
        else
        {
            ans+=2*z1;
            if(x1<z2)
            {
                z2-=x1;
                ans-=z2*2;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

C. Mere Array

题目:http://codeforces.com/contest/1401/problem/C

题解:用两个数组来判断,其一数组来记录数字,另一数组排序形成最终的答案数组。

然后我们理解一下,第i个第j个数交换位置,相当于第i个数先和最小数交换,然后最小数在和第j个数交换。因此,从头到尾对比两个数组,如果数字不一致,判断原来数组是否整除最小数,如果不能整除代表此位置不能交换,因而不会形成最终的不递减数组。

代码:

#include<bits/stdc++.h>    //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 100010;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;

ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
ll a[maxn],b[maxn];
int main()
{
    IOS;
    int t,i,j,n,tmp;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>a[i];
            b[i]=a[i];
        }
        sort(a,a+n);
        bool flag=false;
        for(i=0;i<n;i++)
        {
            if(a[i]!=b[i])
            {
                if(b[i]%a[0]!=0)
                {
                    flag=true;
                    break;
                }
            }
        }
        if(flag==true)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xiaofengzai/p/13545993.html