其他分享
首页 > 其他分享> > CodeForces Round#638 div2

CodeForces Round#638 div2

作者:互联网

contest1348

2020-05-11

A.Puzzle Pieces

最后一位数大于前面所有数字的和,因此最后一位和1到n-1位数为一组,剩下为另一组,贪心即可。

#include <iostream>
#include<queue>
#include<map>
#include<utility>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<stdio.h>
#include<sstream>
#include<fstream>
#include<cmath>
#include<math.h>
using namespace std;
typedef  long long  ll;                    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
typedef pair<int, int> P;
unsigned int m, n, t,f,w,x;
map<P, vector<int> > mapp ;
long long dat[31] = {};
void solve() {
    cin >> m;
    ll ans = dat[m];
    for (int i = m - 1; i >= m / 2; i--)
        ans -= dat[i];
    for (int i = 1; i < m / 2; i++)
        ans += dat[i];
    cout << ans << endl;

    
}
int main() {
    dat[0] = 1;
    for (int i = 1; i <= 30; i++) 
        {
            dat[i] = dat[i - 1] * 2;
        }
        cin >> t;
        for (int i = 0; i < t; i++) {

            solve();
        }
        return 0;
}

 

B.Phoenix and Beauty

 

这题被卡了好久(剩下的看都没看)

每个长度为n的子列和相等==每个子列都有相同的元素==我们要构造出一个循环节为n的序列

 

如果给定的序列不同元素个数大于n,说明肯定不可能构造出这样的序列,直接输出-1

如果给定序列不同元素个数小于n,我们可以随便补个数字构造循环节

构造完之后,输出m次(m等于输入的序列长度),那么每个输入的数都可以在循环节中找到自己对应的位置

使用set维护不同的元素

 

C. Phoenix and Distribution

题目:将给定字符串分为k个字符串,求如何分令最大字符串字典序最小(可以不按顺序)

先给输入的排序

如果最小的字符小于k个,那么最大字串直接就是s[k-1],s[k-1]之后的所有字符可以分配给其他字符串

最小字符个数>=k,前k个都一样,平均分配,如果后面的元素也一样,依旧平均分配,若不同,则全部分配到一个子列中

#include <iostream>
#include<queue>
#include<map>
#include<utility>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<stdio.h>
#include<sstream>
#include<fstream>
#include<cmath>
#include<set>
#include<math.h>
using namespace std;
typedef  long long  ll;                    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
typedef pair<int, int> P;
 int m, n, t,f,w,x;
int dat[10000+105] = {};
int cnt[26] = {};
set<int> s;
void solve() {
    memset(cnt, 0, sizeof(cnt));
    s = set<int>();
    cin >> m >> n;
    string temp;
    cin >> temp;
    sort(temp.begin(), temp.end());
    if (temp[0] != temp[n - 1])
        cout << temp[n - 1];
    else {
        cout << temp[n - 1];
        if (temp[m - 1] == temp[n])
            for (int i = 0; i < (m - 1) / n; ++i) {
                cout << temp[n];
            }
        else
            for (int i = n; i < m; i++)
                cout << temp[i];
    }

    printf("\n");
}
int main() {
    cin >> t;
    for(int i = 0; i < t; ++i) {
        solve();
    }
        return 0;
}

 

 

D. Phoenix and Science

假设s[i]是第i天的细菌个数,那么s[0]到s[i]的和就是前i天的细菌质量的总和    s[0]=1

先以最大速度分裂,那么如果在某一天总质量为加上当天的大与了需要的质量,删去当天的,然后插入一个为质量为n-s的节点

排序,最后输出差分数组即可  

#include <iostream>
#include<queue>
#include<map>
#include<utility>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<stdio.h>
#include<sstream>
#include<fstream>
#include<cmath>
#include<set>
#include<math.h>
using namespace std;
typedef  long long  ll;                    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
typedef pair<int, int> P;
 int m, n, t,f,w,x;
int dat[10000+105] = {};
int cnt[26] = {};
vector<int> s;
void solve() {
    s = vector<int>();
    s.push_back(1);
    cin >> n;
    ll ans = 1;
    ll t = 1;
    while (1)
    {
        t *= 2;
        if ((ans + t) == n) {
            s.push_back(t);
            break;
        }
        if (ans + t > n) {
            s.push_back(n - ans);
            break;
        }
        ans += t;
        s.push_back(t);
    }
    sort(s.begin(), s.end());
    cout << s.size()-1 << endl;
    for (int i = 1; i < s.size(); ++i)
        cout << s[i]-s[i-1] << ' ';
    printf("\n");
}
int main() {
    cin >> t;
    for(int i = 0; i < t; ++i) {
        solve();
    }
        return 0;
}

 

标签:typedef,638,ll,CodeForces,long,int,ans,include,div2
来源: https://www.cnblogs.com/pophirasawa/p/12871364.html