牛客周赛 29

牛客周赛 Round 29

文章目录

  • 牛客周赛 Round 29
    • A 小红大战小紫
    • B 小红的白日梦
    • C 小红的小小红
    • D 小红的中位数
    • E 小红构造数组

A 小红大战小紫

语法题

#include 

using namespace std;

int main()
{
    int a , b;
    cin >> a >> b;
    if(a == b)cout << "draw";
    else if(a > b)cout << "kou\n";
    else cout << "yukari\n";
    return 0;
}

B 小红的白日梦

简单贪心能白天就白天

#include 
#define ll long long
using namespace std;

int main()
{
    ll n , ans = 0;
    cin >> n;
    string a , b;
    cin >> a;
    cin >> b;
    for(int i = 0 ; i < n ; i ++){
        if(a[i] == 'Y' && b[i] =='Y')ans += 3;
        else if(a[i] == 'Y' && b[i] == 'N')ans += 2;
        else if(a[i] == 'N' && b[i] == 'Y')ans += 2;
    }
    cout << ans ;
    return 0;
}

C 小红的小小红

贪心,哈希表维护

#include 
#define ll long long
using namespace std;
map<char , int> m;
int main()
{
    string s;
    cin >> s;
    int n = s.size();
    for(int i = 0 ; i < n ; i ++){
        m[s[i]]++;
    }
    m['x']--;
    m['i']--;
    m['a']--;
    m['o']-= 2;
    m['h']--;
    m['n']--;
    m['g']--;
    cout << "xiaohong";
    for(auto x : m){
        for(int i = 0 ; i < x.second ; i ++)cout << x.first;
    }
    return 0;
}

D 小红的中位数

两个 multiset 维护滑动窗口中的前 K 小值

#include 
#define ll long long
using namespace std;
const int N = 1e5 + 10;
int a[N];
// 两个 multiset 维护滑动窗口中的前 K 小值
struct Magic {
    int K;
    // st1 保存前 K 小值,st2 保存其它值
    multiset<long long> st1, st2;
    // sm 表示 st1 中所有数的和
    long long sm;

    Magic(int K): K(K), sm(0) {}

    // 调整 st1 和 st2 的大小,保证调整后 st1 保存前 K 小值
    void adjust() {
        while (st1.size() < K && st2.size() > 0) {
            long long t = *(st2.begin());
            st1.insert(t);
            sm += t;
            st2.erase(st2.begin());
        }
        while (st1.size() > K) {
            long long t = *prev(st1.end());
            st2.insert(t);
            st1.erase(prev(st1.end()));
            sm -= t;
        }
    }

    // 插入元素 x
    void add(long long x) {
        if (!st2.empty() && x >= *(st2.begin())) st2.insert(x);
        else st1.insert(x), sm += x;
        adjust();
    }

    // 删除元素 x
    void del(long long x) {
        auto it = st1.find(x);
        if (it != st1.end()) st1.erase(it), sm -= x;
        else st2.erase(st2.find(x));
        adjust();
    }
};

int main()
{
    int n;
    cin >> n;
    Magic magic((n - 1) / 2);
    for(int i = 0 ; i < n ; i ++){
        cin >> a[i];
        magic.add(a[i]);
    }
    vector<double> ans;
    magic.del(a[0]);
    if((n - 1)  % 2 == 0)ans.push_back(((double)*prev(magic.st1.end()) + *magic.st2.begin()) / 2);
    else ans.push_back((double)*magic.st2.begin());
    for(int i = 1 ; i < n ; i ++){
        magic.add(a[i - 1]);
        magic.del(a[i]);
        if((n - 1)  % 2 == 0)ans.push_back(((double)*prev(magic.st1.end()) + *magic.st2.begin()) / 2);
        else ans.push_back((double)*magic.st2.begin());
    }
    for(auto x : ans){
        printf("%.1lf\n" , x);
    }
    return 0;
}

E 小红构造数组

1、 分解质因数
2、判断最大数,先不断输出最大数的第二的数直到它俩相等
3、遍历输出

#include
using namespace std;
#define int long long
signed main(){
    int n,i;
    map<int,int>m;
    cin>>n;
    if(n==1)return cout<<-1,0;
    for(i=2;i*i<=n;i++){
        while(n%i==0){
            m[i]++;
            n/=i;
        }
    }
    if(n>1)m[n]++;
    set<pair<int,int>>s;
    int sum=0,ma=0;
    for(auto i:m){
        sum+=i.second;
        ma=max(ma,i.second);
        s.insert({i.second,i.first});
    }
    if(ma-1>sum-ma)return cout<<-1,0;
    cout<<sum<<'\n';
    if(s.size()==1){
        cout<<(*(s.begin())).second<<'\n';
        return 0;
    }
    while(sum>0){
        auto temp=*s.rbegin();
        s.erase(temp);
        auto temp2=*s.rbegin();
        s.erase(temp2);
        if(temp.first!=temp2.first){
            cout<<temp.second<<" ";
            temp.first--;
            if(temp.first){
                cout<<temp2.second<<" ";
                temp2.first--;
            }
            else break;
            s.insert(temp);
            s.insert(temp2);
        }
        else{
            s.insert(temp);
            s.insert(temp2);
            break;
        }
        sum--;
    }
    vector<pair<int,int>>v;
    for(auto i:s){
        v.push_back(i);
    }
    while(1){
        int jud=0;
        for(i=v.size()-1;i>=0;i--){
            if(v[i].first){
                cout<<v[i].second<<" ";
                v[i].first--;
                jud=1;
            }
        }
        if(!jud)break;
    }        
}

你可能感兴趣的:(算法,算法,c++,数据结构)