1. 程式人生 > 其它 >2022.3.23

2022.3.23

Codeforces Round #764 (Div. 3)

A. Plus One on the Subset

從最小的變成最大的,也就是最大值和最小值之差。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,INF=1e8;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin >> n;
        int mmax = -1, mmin = 1e9;
        for (int i = 1; i <= n;i++)
        {
            int x;
            cin >> x;
            mmin = min(mmin, x);
            mmax = max(mmax, x);
        }
        cout << mmax - mmin << '\n';
    }
    return 0;
}

B - Make AP

讓他變成等差數列但是注意是不能改變a,b,c的順序的,先判斷abc原本是不是等差數列,如果不是再判斷,如果公差大於b的話並且a+c能夠整除2b的話說明是可以構造的(等差數列性質,a1+a3=2a2),否則不行,如果公差小於等於b的話,那麼久看看a和c能不能再構成一個等差數列,正的反的都可以。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,INF=1e8;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int a, b, c;
        cin>>a >> b >> c;
        if(a+c==2*b)
            cout << "YES" << '\n';
        else 
        {
            if(2*b<a+c)
            {
                if((a+c)%(2*b)==0)
                    cout << "YES" << '\n';
                else
                    cout << "NO" << '\n';
            }
            else 
            {
                if((2*b-c)%a==0)
                {
                    cout << "YES" << '\n';
                }
                else if((2*b-a)%c==0)
                {
                    cout << "YES" << '\n';
                }
                else
                    cout << "NO" << '\n';
            }
        }
    }
    return 0;
}

C. Division by Two and Permutation

最終是要構成全排列,我們把當前大於n的數不斷除2直到小於n,並且記錄當前可以用於構成全排列的數的數量。如果當某個位置的數有多個的話只保留一個,並讓多出來的/2,構成其他的,如果到最後每個位置都有的話說明成功。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=50+10,INF=1e8;
int a[N],cnt[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        memset(cnt, 0, sizeof cnt);
        int n;
        cin >> n;
        for (int i = 1; i <= n;i++)
        {
            cin >> a[i];
        }
        for (int i = 1; i <= n;i++)
        {
            while(a[i]>n)
            {
                a[i] /= 2;
            }
            cnt[a[i]]++;
        }
        int f = 0;
        for (int i = n; i >= 1;i--)
        {
            if(cnt[i]==0)
            {
                f = 1;
                break;
            }
            while(cnt[i]>1)
            {
                cnt[i]--;
                cnt[i / 2]++;
            }
        }
        if(f)
            cout << "NO" << '\n';
        else
            cout << "YES" << '\n';
    }
    return 0;
}

D - Palindromes Coloring

我們先統計一下每個字母的個數,看看有多少對字母,通過這些字母可以構成迴文串,但是漏看了剩下的落單的字母個數,因為我們要使當前的長度最小的迴文串的長度儘可能的大,如果剩下來的字母的數量足夠讓每個字串的長度都+1的話就可以實現了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=2e5+10,INF=1e8;
int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        memset(a, 0, sizeof a);
        string s;
        int n, k;
        cin >> n >> k;
        cin >> s;
        for (int i = 0; i < s.size();i++)
        {
            a[s[i]-'a']++;
        }
        int cnt1=0,cnt2=0;
        for (int i = 0; i < 26;i++)
        {
            cnt1 += a[i] / 2;
            if(a[i]&1)
                cnt2++;
        }
        int ans = cnt1 / k;
        if((cnt1-ans*k)*2+cnt2>=k)
            cout << ans * 2 + 1 << '\n';
        else cout << ans * 2 << '\n';
    }
    return 0;
}