Codeforces 466 Div2

A签到题略过。
B虽然不难但仔细讨论起来还挺麻烦的,不想清楚容易GG。
这里写图片描述

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    long long n,k,a,b,i,j;
    cin>>n>>k>>a>>b;
    long long x;long long cost=0;
    while(1){
        x=n/k*k;
        cost+=(n-x)*a;
        n=x;
        if(b>=(n-n/k)*a)break;
        n/=k;cost+=b;
    }
    cout<<cost+(n-1)*a<<endl;

    return 0;
}

C.并不难

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
struct cmp {
    bool operator()(char a, char b) {
        return a > b;
    }
};
int main()
{
    string str,str1;
    int n,k,i,j;
    cin>>n>>k;getchar();getline(cin,str);
    set<char,cmp>s;//记录出现过的字符,并且从大到小排列
    for(i=0;i<n;i++)s.insert(str[i]);
    if(k>n){//如果目标字符串更长,显然在原串后面接上最小的字符补齐长度即可
        string str2(k-n,*s.rbegin());str+=str2;cout<<str<<endl;return 0;
    }
    int pos=min(n,k)-1;
    while(str[pos]==*s.begin()){//否则,从后往前,找到第一个可以放更大字符的地方,这样弄出来的字符串一定是最小的.
        pos--;
    }
    str1=str.substr(0,pos);
    auto a=s.begin();
    for(;*a!=str[pos];a++);
    a--;str1+=*a;string str2(k-pos-1,*s.rbegin());
    str1+=str2;
    cout<<str1<<endl;

    return 0;
}

D.
简单分析可以发现以下事实:
这里写图片描述
其中的1,3是可以不用考虑的,因为我们只是想知道l的最小值与r的最大值。同时,可以发现在序列中的数必然是4个4个一样的数连着出现的,也就是一定是0000111100000000这样。可以很快写出代码:
注意题目答案可能很多

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    int n,i,j,k,num[100005];string str;
    cin>>n;
    for(i=1;i<=n;i++)scanf("%d",&num[i]);getchar();
    getline(cin,str);int l=-1e9,r=1e9;
    for(i=2;i<=n;i++){
        if(str[i-1]!=str[i-2]){
            if(str[i-1]=='1') {
                for (j = i - 4; j <= i; j++)
                    l=max(l,num[j]+1);
            }
            else{
                for(j=i-4;j<=i;j++)
                    r=min(r,num[j]-1);
            }
        }
    }
    cout<<l<<' '<<r<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/humveea6/article/details/80106771