cf638 div2 abcd

传送门  //cf638div2 


 

A   Phoenix and Balance standard input/output 2 s, 256 MB Submit Add to favourites     x19609

//taskA A1+....+An-1 < An  O(n)

//so let ans = An+A1+..+An/2-1-(An/2+an-1)

B   Phoenix and Beauty standard input/output 2 s, 256 MB Submit Add to favourites     x12815

//taskB 最后会是一个k长度的数组的循环,  O(n(logn+k))

//所以如果数组a中的不同的数多于k 便无解

//否则就构造一个k数组即可,数组a中出现过的数全放里面,如果长度还还不足k 填任意数字将k数组填满即可

//需要n个k循环, 这样的数组肯定包含 原数组a

C   Phoenix and Distribution standard input/output 2 s, 256 MB Submit Add to favourites     x8421

//taskC S0S1S2.......Sn-1   O(tlogn) sort

// if(s[0] != s[k-1])  可以将 Sk-Sn 分给S0-Sk-2,所以字典序最大的为 Sk-1

// else  将S0-Sk-1 每个都作为字符串的开头

// 再分析 Sk-Sn  if Sk!=Sn 那么可以将Sk-Sn都作为一个字符串这样字典序是最小的 同样是数组的最大字典序

//              if Sk==Sn 那么将Sk-Sn 平均分成k份即可,如果有多余的就加到ans字符串后面, 这就是字典序最大的字符串

D   Phoenix and Science standard input/output 2 s, 256 MB Submit Add to favourites     x5045

//taskD 观察一下一天细胞的mass变化   O(logn)

//假设初始mass为x, 那么一天以后mass会变成 x+1,2x

//最小为不分裂  最大为全部分裂

//所以我们可以试着构造一个 1 2 4 8 16...... 的序列且这个序列一定是最快的

//然后把 n 构造一个这样序列, 如果有多余的话 那就相当于多一天 不分裂

//比如说 n为14 那么可以构造为 1 2 4, 多余为7 那么就为1 2 4 7

//意味着 第一天1个细胞分裂成2个  第二天2个细胞分裂成4个 第三天只有三个细胞分裂,细胞数为6+1个

//构造的序列排个序, 相邻的差值即为每天的分裂细胞数

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define ll long long
#define all(v) (v).begin(), (v).end()
#define _for(i,a,b) for(int i = (a); i < (b); i++) 
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)

const int kMod = 1e9 + 7;
const int kMaxN = 1e6 + 5;

 

ll fpow(ll a, ll b) {
    ll ret = 1;
    while(b) {
        if(b & 1) ret *= a;
        b >>= 1;
        a *= a;
    }
    return ret;
}
void taskA() {
    int t; cin >> t;
    while(t--) {
        int n; cin >> n;
        ll a = 0, f = 1;
        a += fpow(2, n);
        _for(i,1,n/2) a += fpow(2, i);
        _for(i,n/2,n) a -= fpow(2, i);
        if(a < 0) a *= -1;
        cout << a << "\n";
    }
    return;
}

 

void taskB() {
    int t; cin >> t;
    while(t--) {
        int n,k; cin >> n >> k;
        set<int> s;
        int x;
        _for(i,0,n) cin >> x, s.insert(x);
        int len = s.size();
        if(len > k) {cout << "-1\n"; continue;}
        cout << n*k << "\n";
        _for(i,0,n) {
            for(auto it : s) cout << it << " ";
            _for(i,len,k) cout << "1 ";
        } cout << "\n";
    }
    return;
}

 

void taskC() {
    int t; cin >> t;
    while(t--) {
        int n,k; cin >> n >> k;
        string s; cin >> s;
        sort(all(s));
        if(s[0] != s[k-1]) {
            cout << s[k-1] << "\n";
            continue;
        }
        cout << s[0];
        if(s[k] != s[n-1]) {
            _for(i,k,n) cout << s[i];
        } 
        else {        
            _for(i,0,(n-1-k+k-1)/k) cout << s[k];
        } cout << "\n";
    }
    return;
}

 

void taskD() {
    int t; cin >> t;
    while(t--) {
        int n; cin >> n;
        vector<int> a;
        for(int i = 1; i <= n; i *= 2) {
            a.push_back(i);
            n -= i;
        }
        if(n) {
            a.push_back(n);
            sort(all(a));
        }
        int len = a.size();
        cout << len-1 << "\n";
        _for(i,1,len) cout << a[i]-a[i-1] << " ";
        cout << "\n";
    }
    return;
}

 

int main(){
    ios::sync_with_stdio(false), cin.tie(nullptr);
    //taskA();
    //taskB();
    //taskC();
    //taskD();
    return 0;
}

 

 

 


https://codeforces.com/contest/1348/problem/B

posted @ 2020-05-08 03:02  163467  阅读(190)  评论(0编辑  收藏  举报