Educational Codeforces Round 116 (Rated for Div. 2) A B C

Educational Codeforces Round 116 (Rated for Div. 2) A B C

A. AB Balance

  • 题意:使得区间内ab的数量的ba的数量相同,每次操作只能改变一个idx上的字符为A或者B,求最小的操作次数
  • 思路:统计一便ab和ba分别的数量如果相等直接输出结束,否则如果ab数量大于ba我们只需要将最后一个b变成a,ab数量小于ba将最后一个a变成b
  • 参考代码:
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
void solve(){
    
    
    string s;
    cin>>s;
    int cnt1=0,cnt2=0;
    for(int i=0;i<s.size()-1;i++){
    
    
        if(s[i]=='a'&&s[i+1]=='b')cnt1++;
    }
    for(int i=1;i<s.size();i++){
    
    
        if(s[i-1]=='b'&&s[i]=='a')cnt2++;
    }
    if(cnt1==cnt2)cout<<s<<endl;
    else{
    
    
        if(cnt1>cnt2){
    
    
            int idx=0;
            for(int i=0;i<s.size();i++){
    
    
                if(s[i]=='b')idx=i;
            }
            s[idx]='a';
        }
        else{
    
    
            int idx=0;
            for(int i=0;i<s.size();i++){
    
    
                if(s[i]=='a')idx=i;
            }
            s[idx]='b';
        }
        cout<<s<<endl;
    }
}
int main(){
    
    
    snow;
    int t;
    cin>>t;
    while(t--){
    
    
        solve();
    }
    return 0;
}

B. Update Files

  • 思路:一开始只有一个电脑有更新文件,那么传输只能从1开始,如果没有电线数量的限制,那么显然传输的数量会呈现 1 2 4 8 16 …这样的变化。因为有电线数量的限制,所以我们只要判断一下如果理论传输数量使用的电线大于已有电线的数量,那么我们接下去就用已有电线数量进行更新即可。
  • 参考代码
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
void solve(){
    
    
    long long a,k;
    cin>>a>>k;
    long long cnt=1;
    a-=1;
    if(a==0){
    
    
        cout<<0<<endl;
        return ;
    }
    long long hour=0;
    while(a>0){
    
    
        if(cnt<=k){
    
    
            a-=cnt;
            cnt*=2;
            hour++;
        }
        else{
    
    
            break;
        }
    }
    cnt=k;
    if(a>0){
    
    
        hour+=a/cnt;
        if(a%cnt)hour++;
    }
    cout<<hour<<endl;
}
int main(){
    
    
    snow;
    int t;
    cin>>t;
    while(t--){
    
    
        solve();
    }
    return 0;
}

C. Banknotes

  • 思路:贪心思想, f ( s ) > k f(s)>k f(s)>k的意思是至少使用 k + 1 k+1 k+1个纸币使得形成的 s s s值最小,例如 59 59 59是由 9 9 9 1 1 1块钱的纸币和 5 5 5 10 10 10块钱的纸币组成的,也是用14张纸币组成的面值最小的金额。有人会有疑问为什么不能是 14 14 14 1 1 1块钱的纸币呢 ? ? ?这样组成的不是更小吗 ? ? ?,但是 14 14 14是可以由 1 1 1 10 10 10元面值和 5 5 5张1元面值组成所以, f ( 14 ) = 6 f(14)=6 f(14)=6而不是14。相对应的 f ( 19 ) = 10 f(19)=10 f(19)=10 f ( 29 ) = 11 f(29)=11 f(29)=11
  • 参考代码
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N=10;
long long a[N];
long long b[N];
void solve(){
    
    
    int n,k;
    cin>>n>>k;
    memset(b,0,sizeof b);
    for(int i=0;i<n;i++){
    
    
        cin>>a[i];
    }
    k+=1;
    long long res=0;
    for(int i=0;i<n;i++){
    
    
        b[i]=pow(10,a[i]);
    }
    for(int i=0;i<n;i++){
    
    
        if(b[i]*k<b[i+1]){
    
    
            res+=b[i]*k;
            cout<<res<<endl;
            return ;
        }
        else if(b[i+1]&&k>(b[i+1]/b[i])-1){
    
    
            res+=b[i]*((b[i+1]/b[i])-1);
            k-=(b[i+1]/b[i])-1;
        }
        else{
    
    
            res+=b[i]*k;
            cout<<res<<endl;
            return ;
        }
    }
}
int main(){
    
    
    snow;
    int t;
    cin>>t;
    while(t--){
    
    
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_53504307/article/details/121057249