• Codeforces Round #603 (Div. 2) ABC 题解


    A. Sweet Problem

    题意:有三个数,每次可以选两个-1,问最多能挑多少次。

    思路:贪心一下。策略如下:
    1.先将三个数排个序。
    2.然后如果最大的和次大的不一样多的话,就让最大的和最小的一起减少,尽量减少到和次大的一样大。
    3.然后a[2]和a[3]一样大时,若a[1]还有剩的,就和a[2]、a[3]均分一下,多出来的随便给。
    4.最后a[2]和a[3]一起减少。贡献取最小值。

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include <queue>
    #include<sstream>
    #include <stack>
    #include <set>
    #include <bitset>
    #include<vector>
    #define FAST ios::sync_with_stdio(false)
    #define abs(a) ((a)>=0?(a):-(a))
    #define sz(x) ((int)(x).size())
    #define all(x) (x).begin(),(x).end()
    #define mem(a,b) memset(a,b,sizeof(a))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define rep(i,a,n) for(int i=a;i<=n;++i)
    #define per(i,n,a) for(int i=n;i>=a;--i)
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> PII;
    const int maxn = 1e5+200;
    const int inf=0x3f3f3f3f;
    const double eps = 1e-7;
    const double pi=acos(-1.0);
    const int mod = 1e9+7;
    inline int lowbit(int x){return x&(-x);}
    ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
    inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
    inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
    inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
    inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x*f; }
    int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
    
    ll a[5];
    
    int main()
    {
        int kase;
        cin>>kase;
        while(kase--)
        {
            cin>>a[1]>>a[2]>>a[3];
            sort(a+1,a+1+3);
            ll ans = 0;;
            if(a[3] > a[2])
            {
                ll d = min(a[1], a[3] - a[2]);
                ans += d;
                a[3] -= d;
                a[1] -= d;
            }
            if(a[3]==a[2]&&a[1])
            {
                ll d = a[1] /2 ;
                ans += d*2;
                ans += a[1]%2;
                a[3] -= a[1]%2;
                a[3] -= d, a[2] -= d;
            }
            ans += min(a[2], a[3]);
            cout<<ans<<endl;
        }
        return 0;
    }
    
    

    B. PIN Codes

    题意,给你n个数,问你最小改变他们中多少个位,才能使得全部都不一样。

    发现n最大也就10。所以我们只需要考虑个位即可。如果前三位都一样,我们就改变个位。若前三位有不一样的,就不需要改。

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include <queue>
    #include<sstream>
    #include <stack>
    #include <set>
    #include <bitset>
    #include<vector>
    #define FAST ios::sync_with_stdio(false)
    #define abs(a) ((a)>=0?(a):-(a))
    #define sz(x) ((int)(x).size())
    #define all(x) (x).begin(),(x).end()
    #define mem(a,b) memset(a,b,sizeof(a))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define rep(i,a,n) for(int i=a;i<=n;++i)
    #define per(i,n,a) for(int i=n;i>=a;--i)
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> PII;
    const int maxn = 1e5+200;
    const int inf=0x3f3f3f3f;
    const double eps = 1e-7;
    const double pi=acos(-1.0);
    const int mod = 1e9+7;
    inline int lowbit(int x){return x&(-x);}
    ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
    inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
    inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
    inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
    inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x*f; }
    int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
    
    map<string, int> Map;
    
    int main()
    {
        int kase;
        cin>>kase;
        while(kase--)
        {
            vector<string> s;
            Map.clear();
            int n; cin>>n;
            rep(i,1,n)
            {
                string tmp;
                cin>>tmp;
                s.pb(tmp);
                Map[tmp]++;
            }
            int cnt = 0;
            rep(i,1,n)
            {
                string cur = s[i-1];
                if(Map[cur]>1)
                {
                    for(int j=0; j<=9; j++)
                    {
                        s[i-1][3] = j + '0';
                        if(!Map[s[i-1]])
                        {
                            cnt++;
                            Map[s[i-1]] ++;
                            Map[cur] --;
                            break;
                        }
                    }
                }
            }
            cout<<cnt<<'
    ';
            rep(i,1,n) cout<<s[i-1]<<'
    ';
        }
        return 0;
    }
    
    

    C. Everyone is a Winner!

    题意:问你 (lfloor n/1 floor), (lfloor n/2 floor), (lfloor n/3 floor) ..... (lfloor n/n floor), (lfloor n/(n+1) floor) 共有多少种不同的数。

    其实这是整数分块的模板题了。如果直接遍历的话是O(n)的时间复杂度,必超时。
    我们发现,如n = 100时, n/20 = 5, n/21 = n/22 = n/23 = n/24 = n/25 = 4,像[21,25]完全不用再遍历的。我们在到i=21时,就可以知道商为4时最远能到哪里——能到(n/(n/21)) = 25,所以下次遍历的时候直接从25开始即可。 这便是整数分块的思想。详见代码,时间复杂度O((sqrt{n}))。

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include <unordered_map>
    #include <queue>
    #include<sstream>
    #include <stack>
    #include <set>
    #include <bitset>
    #include<vector>
    #define FAST ios::sync_with_stdio(false)
    #define abs(a) ((a)>=0?(a):-(a))
    #define sz(x) ((int)(x).size())
    #define all(x) (x).begin(),(x).end()
    #define mem(a,b) memset(a,b,sizeof(a))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define rep(i,a,n) for(int i=a;i<=n;++i)
    #define per(i,n,a) for(int i=n;i>=a;--i)
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> PII;
    const int maxn = 1e5+200;
    const int inf=0x3f3f3f3f;
    const double eps = 1e-7;
    const double pi=acos(-1.0);
    const int mod = 1e9+7;
    inline int lowbit(int x){return x&(-x);}
    ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
    inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
    inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
    inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
    inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x*f; }
    int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
    
    vector<ll> res;
    
    void solve(ll n)
    {
        for(ll l=1,r=0; l<=n; l = r+1)
        {
            res.pb(n/l);
            r = (n/ (n/l));
        }
    }
    
    int main()
    {
        int kase;
        cin>>kase;
        while(kase--)
        {
            res.clear();
            ll n = read();
            solve(n); res.pb(0);
            sort(res.begin(),res.end());
            cout<<res.size()<<'
    ';
            for(int i=0; i<res.size();i++)
            cout<<res[i]<<' ';
            cout<<'
    ';
        }
        return 0;
    }
    
    
  • 相关阅读:
    pt-tcp-model
    (转)从史上八大MySQL宕机事故中学到的经验
    pt-query-digest
    DNS生效时间
    Python之uuid模块
    一个IO的传奇一生
    Python之Queue模块
    利用freemarker 静态化网页
    FreeMarker教程
    模板引擎freemarker的简单使用教程
  • 原文地址:https://www.cnblogs.com/Bgwithcode/p/13549383.html
Copyright © 2020-2023  润新知