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\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-Ackerman/p/13200324.html