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

清風紫雪發表於2020-08-22

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;
}

 

相關文章