zoukankan      html  css  js  c++  java
  • Codeforces Round #638 (Div. 2). B C D E

    CF1348B Phoenix and Beauty

    想法:

    我们可以直接考虑序列 a 中不同元素的个数,如果不同元素的个数 > k ,那么肯定是无解的,直接输出 -1 

    不然的话,我们考虑直接将这不同的数 ( <= k 个 ) 复制 n 次,如果个数不满 k 的话,我们考虑都添加相同的数上去就好了。

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <cmath>
    #include <cstdio>
    #include <iomanip>
    #include <ctime>
    #include <bitset>
    #include <cmath>
    #include <sstream>
    #include <iostream>
    
    #define ll long long
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define INF 0x3f3f3f3f3f3f3f3f
    #define max(a, b) (a>b?a:b)
    #define min(a, b) (a<b?a:b)
    #define LL ll
    
    const double eps = 1e-10;
    const int maxn = 2e4 + 10;
    const LL MOD = 99999999999999;
    
    int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }
    
    using namespace std;
    
    
    ll a[maxn],b[2*maxn];
    int main() {
        ios::sync_with_stdio(false);
        int t;
        cin >> t;
        while (t--) {
            int n,k;
            cin >> n >> k;
            set<ll> st;
            for (int i = 1;i <= n;i++) {
                cin >> a[i];
                st.insert(a[i]);
            }
            if (st.size() > k)
                cout << -1 << endl;
            else {
                cout << n * k << endl;
                for (int i = 1;i <= n;i++) {
                    for (auto x:st)
                        cout << x << " ";
                    for (int j = 1;j <= k-st.size();j++)
                        cout << 1 << " ";
                }
                cout << endl;
            }
        }
        return 0;
    }

    CF1348C Phoenix and Distribution

    想法:

    我们很容易想到对字符串进行排序之后,前 k 个字符分别对应 分成的 k 个部分的首字符,然后我们分类讨论

    如果 s[1] != s[k] ,  那么我们直接输出 s[k] 就好了,因为它一定是最大的。

    如果 s[1] == s[k] && s[k+1] != s[n] , 那么我们直接将 k ~ n 直接输出就好了

    如果 s[1] == s[k] && s[k+1] == s[n] ,那么我们考虑均匀分配,就像 样例一 一样

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <cmath>
    #include <cstdio>
    #include <iomanip>
    #include <ctime>
    #include <bitset>
    #include <cmath>
    #include <sstream>
    #include <iostream>
    
    #define ll long long
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define INF 0x3f3f3f3f3f3f3f3f
    #define max(a, b) (a>b?a:b)
    #define min(a, b) (a<b?a:b)
    #define LL ll
    
    const double eps = 1e-10;
    const int maxn = 2e5 + 10;
    const LL MOD = 99999999999999;
    
    int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }
    
    using namespace std;
    
    char s[maxn];
    
    int main() {
        ios::sync_with_stdio(false);
        int t;
        cin >> t;
        while (t--) {
            int n,k;
            cin >> n >> k;
            cin >> (s+1);
            sort(s+1,s+1+n);
            if (s[1] != s[k])
                cout << s[k] << endl;
            else if (s[k+1] != s[n]) {
                for (int i = k;i <= n;i++)
                    cout << s[i];
                cout << endl;
            }
            else {
                cout << s[1];
                for (int i = 1;i <= (n-1)/k;i++)
                    cout << s[k+1];
                cout << endl;
            }
        }
        return 0;
    }

    CF1348D Phoenix and Science

     想法:

    我们不难发现每次增长的质量其实是和此时细菌的个数有关的。

    我们假设第i天有 x 个细菌,当天晚上的话 我们的质量最多可以为 2x

    我们考虑贪心的每次选取最多的,然后后面肯定是剩下一个不是最大的,那样我们直接取出来就好了。

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <cmath>
    #include <cstdio>
    #include <iomanip>
    #include <ctime>
    #include <bitset>
    #include <cmath>
    #include <sstream>
    #include <iostream>
    
    #define ll long long
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define INF 0x3f3f3f3f3f3f3f3f
    #define max(a, b) (a>b?a:b)
    #define min(a, b) (a<b?a:b)
    #define LL ll
    
    const double eps = 1e-10;
    const int maxn = 2e4 + 10;
    const LL MOD = 99999999999999;
    
    int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }
    
    using namespace std;
    
    
    int main() {
        ios::sync_with_stdio(false);
        int t;
        cin >> t;
        while (t--) {
            vector<ll> v;
            ll n;
            cin >> n;
            ll x = 1;
            while (n > 0) {
                if (n < x)
                    v.push_back(n);
                else
                    v.push_back(x);
                n -= x;
                x <<= 1;
            }
            cout << v.size() - 1 << endl;
            sort(v.begin(),v.end());
            for (int i = 1;i < v.size();i++)
                cout << v[i] - v[i-1] << ' ';
            cout << endl;
        }
        return 0;
    }

    CF1348E Phoenix and Berries

    想法:

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <cmath>
    #include <cstdio>
    #include <iomanip>
    #include <ctime>
    #include <bitset>
    #include <cmath>
    #include <sstream>
    #include <iostream>
    
    #define ll long long
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    #define INF 0x3f3f3f3f3f3f3f3f
    #define max(a, b) (a>b?a:b)
    #define min(a, b) (a<b?a:b)
    
    
    const double eps = 1e-10;
    const int maxn = 5e2 + 10;
    const ll MOD = 99999999999999;
    
    int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }
    
    using namespace std;
    
    template<typename elemType>
    inline void Read(elemType &T){
        elemType X=0,w=0; char ch=0;
        while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
        while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        T=(w?-X:X);
    }
    
    ll dp[maxn][maxn];
    int a[maxn],b[maxn];;
    
    int main() {
        ios::sync_with_stdio(false);
        int n,k;
        Read(n);
        Read(k);
        for (register int i = 1;i <= n;i++) {
            Read(a[i]);
            Read(b[i]);
        }
        memset(dp,-1,sizeof(dp));
        dp[0][0] = 0;
        ll sum = 0;
        for (register int i = 1;i <= n;++i) {
            for (register int j = 0;j < k;++j) {
                if (dp[i-1][j] == -1)
                    continue;
                dp[i][(j+a[i])%k] = dp[i-1][j] + (j+a[i])/k +(sum-j-dp[i-1][j]*k+b[i])/k;  // 不考虑混合的情况
                for (register int z = 0;z < k;++z) {
                    if (a[i] >= z && b[i] >= k-z)
                        dp[i][(j+a[i]-z)%k] = max(dp[i][(j+a[i]-z)%k],dp[i-1][j] + 1 + (j+a[i]-z)/k + (sum-j-k*dp[i-1][j]-(k-z)+b[i])/k);
                }
            }
            sum += (a[i] + b[i]);
        }
        ll ans = 0;
        for (register int i = 0;i < k;i++)
            ans = max(ans,dp[n][i]);
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    cookie
    手写Promise/Promise.all/promise.race
    Hbuilder如何真机调试?
    什么是深拷贝?什么是浅拷贝?如何实现深拷贝?
    Vue.set()?怎么用?
    vueRouter怎么用?
    Vue如何实现组件间通信?
    reduce()累加器
    filter()数组遍历
    map()数组遍历
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/13200324.html
Copyright © 2011-2022 走看看