Codeforces Round #638 (Div. 2)

 A. Phoenix and Balance

题目链接:https://codeforces.ml/contest/1348/problem/A

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #define rush() int T;cin>>T;while(T--)
    #define go(a) while(cin>>a)
    #define ms(a,b) memset(a,b,sizeof a)
    #define E 1e-8
    using namespace std;
    typedef long long ll;
    const int idata=1e6+5;
    const int inf=0x3f3f3f3f;
     
    int n,m,t,_;
    int i,j,k;
    int cnt,num,ans;
    int maxx=-1,minn=inf;
    vectorv;
    int a[idata];
     
    int main()
    {
        cin.tie(0);
        iostream::sync_with_stdio(false);
        for(i=1;i<=30;i++){
            a[i]=(1<>n;
            for(i=1;i<=n;i++){
                if(i==n || i

 B. Phoenix and Beauty


题目链接:https://codeforces.ml/contest/1348/problem/B

 题目大意:任意k长度的子序列的和都相等

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
using namespace std;
typedef long long ll;
const int idata=1e6+5;
const int inf=0x3f3f3f3f;

int n,m,t,_;
int i,j,k;
int cnt,num,ans;
int maxx=-1,minn=inf;
vectorv;
mapmp;
//int a[idata];

int main()
{
    cin.tie(0);
    iostream::sync_with_stdio(false);
    rush()
    {
        v.clear();
        mp.clear();
        cnt=0;
        cin>>n>>k;
        for(i=1;i<=n;i++){
            cin>>num;
            if(!mp[num]){
                v.push_back(num);
                mp[num]=1;
                cnt++;
            }
        }
        if(cnt>k){//出现元素种类数大于周期数
            cout<<-1<

 C. Phoenix and Distribution


题目链接:https://codeforces.ml/problemset/problem/1348/C

 题目大意:给出长度为n的字符串,分成k个字串,求k个子串当中字典序最大的那个字串的最小值

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
using namespace std;
typedef long long ll;
const int idata=1e6+5;
const int inf=0x3f3f3f3f;

int n,m,t,_;
int i,j,k;
int cnt,num;
int maxx=-1,minn=inf;
vectorv;
string s,ans;

int main()
{
    cin.tie(0);
    iostream::sync_with_stdio(false);
    rush()
    {
        bool judge=0;
        cin>>n>>k;
        cin>>s;
        sort(s.begin(),s.end());
        ans.clear();
        if(s[0]==s[k-1]){
            if(s[k]==s[n-1]){
                    num=(n-k)/k;
                    if((n-k)%k) num++;
                    ans=s[0]+s.substr(k,num);
            }
            else ans=s.substr(k-1,n-k+1);//(k-1)--(n-1)共(n-k+1)个字符
        }
        else{
            ans=s[k-1];
        }
        cout<

 D. Phoenix and Science


题目链接:https://codeforces.ml/problemset/problem/1348/D

题目大意:一开始有1个细菌。白天的时候每1个细菌可以分裂成2个,也可以不分裂,晚上的时候每1个细菌会增加mass 1,求最少要多少天能够到达所有mass的和恰好为n,并且给出对应n天每天有几个细菌要分裂。

题目分析:显然要想最快达到n,必须每天分裂,第一晚分裂后,第二天白天+2,晚上再分裂后,第三天白天+4,这就很明显了,任意一个数,都可以被二进制表示。

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
using namespace std;
typedef long long ll;
const int idata=1e6+5;
const int inf=0x3f3f3f3f;

int n,m,t,_;
int i,j,k;
int cnt,num;
int maxx=-1,minn=inf;
vectorv;

int main()
{
    /*cin.tie(0);
    iostream::sync_with_stdio(false);*/
    rush()
    {
        cin>>n;
        v.clear();
        for(i=1;i<=n;i<<=1){
            v.push_back(i);//每天的细胞数量
            n-=i;
        }
        if(n) v.push_back(n);
        sort(v.begin(),v.end());
        /*for(i=0;i

 

 

你可能感兴趣的:(CF,贪心算法)