Codeforces Round #638 (Div. 2)(A~B)

A - Phoenix and Balance

题意:有n个硬币,每一个硬币符合以下关系:21,22.....2n。其中n是偶数,要你将这堆硬币分为两堆,是两堆的重量之差的绝对值最小。

题解:这道题是一个规律题,同时也是一道数论题,解法有很多。这里利用一个数学结论:21+22+23+24+2n-1=2n-1,也就是说2n比前面的和还大,这个时候,我们将前面的n/2-1个数和分给第一个组,后面的分给下一个组,两者之差为最小值。

代码:

#include<iostream>
#define ll long long
using namespace std;
int main(){
    int n,t;
    cin>>n;
    while(n--){
        cin>>t;
        ll ans=1<<t;
        for(int i=1;i<=t-1;i++){
            if(i<t/2){
                ans=ans+(1<<i);
            }else{
                ans=ans-(1<<i);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

B - Phoenix and Beauty

题意:给你一个序列,要你向其中插入若干个数实其成为“完美数列”。

题解:这个题是一个构造里面的接单题,关键是找到不可构造的条件,原数列数字的种类数--这个是关键。

代码:

#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main(){
    int t,n,k;
    cin>>t;
    int temp;
    while(t--){
        cin>>n>>k;
        set<int> se;
        vector<int> ve;
        se.clear();
        ve.clear();
        for(int i=0;i<n;i++){
            cin>>temp;
            se.insert(temp);
        }
        if(se.size()>k){
            cout<<-1<<endl;
            continue; 
        }
        set<int>::iterator it;
        for(it=se.begin();it!=se.end();it++){
            ve.push_back(*it);
        }
        int len=ve.size();
        if(len==k){
        }else{
            for(int i=0;i<k-len;i++){
                ve.push_back(1);
            }
        }
        cout<<n*ve.size()<<endl;
        for(int i=0;i<n;i++){
            for(int j=0;j<ve.size();j++){
                cout<<ve[j];
                if(i==n-1&&j==ve.size()-1){
                    cout<<endl;
                }else{
                    cout<<" ";
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/blogxsc/p/12913784.html