Educational Codeforces Round 179 (Rated for Div. 2)

手速场,切前四题后看表现分2000+且e过的人很少后就开摆了,其实应该能开e的,心态得改一下

A. Energy Crystals

感觉前四题最难的就是A了 找规律打表

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int x;
    cin>>x;

    int val=63-__builtin_clzll(x);

    int ans=val*2+3;
    cout<<ans<<endl;
}


signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

B. Fibonacci Cubes

先判断能不能把最大的放下,再判断能不能把次大的放下。如果都可以,剩下的一定能放下。

因为f[n] = f[n-1] + f[n-2]

如果能放下n,则边长至少是n,再把 n-1 放到 n 上面,如果能放下 n-1 ,则剩下的距离是,f(n) - f(n-1)刚好是f(n-2)

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

int f[14];

void init(){
    f[1]=1;
    f[2]=2;
    for(int i=3;i<=11;i++){
        f[i]=f[i-1]+f[i-2];
    }
}

void solve(){
    int n,m;
    cin>>n>>m;

    while(m--){
        int a,b,c;
        cin>>a>>b>>c;
        int mn=min({a,b,c});
        int mx=max({a,b,c});

        if(mn<f[n]){
            cout<<0;
            continue;
        }

        if(mx-f[n]>=f[n-1]){
            cout<<1;
        }
        else{
            cout<<0;
        }
    }

    cout<<endl;
}


signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    init();

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

C. Equal Values

枚举每个位置的值,让这个位置的值填充整个数组的代价是多少,重点是如果有连续一段相同的数该怎么处理

只要处理出连续一段相同的数的起点和终点l,r即可,答案为 (l-1)a[i] + (n-r)a[i]

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;

    vector<int> a(n+10),ne(n+10);
    bool f=1;

    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(i!=1 && a[i]!=a[i-1]) f=0;
        ne[i]=i;
    }

    if(f){
        cout<<0<<endl;
        return;
    }


    int now=1;
    for(int i=2;i<=n;i++){
        if(a[i]==a[now]){
            ne[now]=i;
        }
        else{
            now=i;
        }
    }

    int ans=inf;
    for(int i=1;i<=n;i++){
        int val=a[i]*(i-1+n-ne[i]);
        ans=min(ans,val);
    }
    cout<<ans<<endl;
}


signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

D. Creating a Schedule

对序列排序后,显然对一个班级,最优的选法是选择第一个和最后一个。

所以,可以让两个班级,轮流在第一个和最后一个教室上课。

再让另外两个班级,轮流做第二个和倒数第二个教室上课。

以此类推,这样能保证距离最远的两个教室一直被占用,使得最后结果最优

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n,m;
    cin>>n>>m;

    vector<int> a(m+1);
    for(int i=1;i<=m;i++){
        cin>>a[i];
    }

    sort(a.begin()+1,a.end());

    int l=1,r=m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=3;j++){
            if(i&1) cout<<a[l]<<" "<<a[r]<<" ";
            else cout<<a[r]<<" "<<a[l]<<" ";
        }
        cout<<endl;
        if((i&1)==0) l++,r--;
    }
}


signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

E. Changing the String

其实这题不难,纯贪心

先把q次操作全部读入,用 set 存起来

从前往后遍历字符串,遇到a就跳过

遇到 b 先尝试能不能直接变成a,再尝试能不能 b->c ,c->a ( 需要保证b->c 的操作时间在 c->a 前面,这一步可以用set的lower_bound找)

遇到 c 先尝试能不能 c->a, 在尝试能不能 c->b->a, 在尝试能不能 c->b

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n,q;
    cin>>n>>q;

    string s;
    cin>>s;
    s=" "+s;

    vector<vector<set<int>>> st(3,vector<set<int>>(3));
    for(int i=1;i<=q;i++){
        char a,b;
        cin>>a>>b;
        st[a-'a'][b-'a'].insert(i);
    }

    for(int i=1;i<=n;i++){
        if(s[i]=='a') continue;
        if(s[i]=='b'){
            //1. b->a
            if(st[1][0].size()){
                auto it=st[1][0].begin();
                st[1][0].erase(it);
                s[i]='a';
            }
            else{
                //2. try b->c, c->a
                if(st[1][2].size()){
                    auto it1=st[1][2].begin();
                    int idx=*it1;
                    auto it2=st[2][0].lower_bound(idx);
                    if(it2==st[2][0].end()) continue;
                    s[i]='a';
                    st[1][2].erase(it1);
                    st[2][0].erase(it2);
                }
            }
        }
        else if(s[i]=='c'){
            //1. c->a
            if(st[2][0].size()){
                auto it=st[2][0].begin();
                st[2][0].erase(it);
                s[i]='a';
            }
            else if(st[2][1].size()){
                //1. c->b
                auto it1=st[2][1].begin();
                int idx=*it1;
                st[2][1].erase(it1);
                s[i]='b';

                //3. c->b->a
                auto it2=st[1][0].lower_bound(idx);
                if(it2!=st[1][0].end()){
                    st[1][0].erase(it2);
                    s[i]='a';
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        cout<<s[i];
    }
    cout<<endl;
}


signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}
posted @ 2025-06-05 19:20  LYET  阅读(54)  评论(0)    收藏  举报