Codeforces Round #624 (Div. 3)ABCD

A. Add Odd or Subtract Even

Codeforces Round #624 (Div. 3)ABCD_第1张图片

a等于b时输出0
a a>b且a-b为偶数输出1
剩下输出2

#include 
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main(){
int t;cin>>t;
    while(t--){
        ll a,b;cin>>a>>b;
        if(a==b)cout<<0<<endl;
        else if((a<b&&(b-a)%2==1)||(a>b&&(a-b)%2==0)){
            cout<<1<<endl;
        }
        else cout<<2<<endl;
    }
    return 0;
}

B. WeirdSort

对每个小的连续可交换的区间进行排序
用begin和end确定区间首尾
最后检查是否有序
之前没过然后加了特判过了 代码有点乱

#include 
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int t;
int m,n;
int a[105];
int p[105];
int main(){
    cin>>t;
    while(t--){
        memset(p,0,sizeof p);
        cin>>m>>n;
        for(int i=1;i<=m;i++){
            cin>>a[i];
        }
        int end;
        for(int i=1;i<=n;i++){
            cin>>p[i];
        }
        if(m==1){
            cout<<"YES"<<endl;
            continue;
        }
        if(n==1){
            if(a[p[1]]>a[p[1]+1])swap(a[p[1]],a[p[1]+1]);
            bool flag=true;
            int maxs=a[1];
            for(int i=2;i<=m;i++){
            if(a[i]<maxs){
                flag=false;
                break;
            }
            else maxs=a[i];
        }//加的特判
        if(flag)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        continue;
    }
        sort(p+1,p+n+1);
        int begin=p[1];
        p[0]=0;
        for(int i=2;i<=n;i++){
            if(p[i]-p[i-1]>=2){
                end=p[i-1]+1;
                sort(a+begin,a+end+1);
                begin=p[i];
            }
            if(i==n){
                end=min(p[n]+1,m);
                sort(a+begin,a+end+1);
            }
        }
        bool flag=true;
        int maxs=a[1];
        for(int i=2;i<=m;i++){
            if(a[i]<maxs){
                flag=false;
                break;
            }
            else maxs=a[i];
        }
        if(flag)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

C. Perform the Combo

第 i 位使用了m-i+1次,可避免对某位重复计算

#include 
using namespace std;
typedef long long ll;
int t,m,n;
int a[200005];
ll p[28];
int main(){
    cin>>t;
    while(t--){
        memset(p,0,sizeof p);
        cin>>n>>m;
        string s;cin>>s;
        for(int i=1;i<=m;i++)cin>>a[i];
        sort(a+1,a+m+1);
        int step=0;
        for(int i=1;i<=m;i++){
            for(int j=step;j<a[i];j++){
                p[s[j]-'a']+=m-i+1;//一次加上所有次的使用
                step=a[i];
            }
        }
        for(int i=0;i<n;i++)p[s[i]-'a']++;
        for(int i=0;i<26;i++)cout<<p[i]<<' ';
        cout<<endl;
    }
    return 0;
}

D. Three Integers

Codeforces Round #624 (Div. 3)ABCD_第2张图片

枚举就完事了
需要注意的是不能枚举到10000为止
否则会过不了
测试数据
1
417 10000 10000
经评论提醒,b和c只要枚举到20000即可
a枚举的区间应为1到2a,因为若枚举到2a+1,必不如减到1为最优解,所以枚举a不超过20000,b和c也不会超过20000

#include 
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main(){
    int t;cin>>t;
    while(t--){
        int a,b,c;cin>>a>>b>>c;
        int sum;
        ll aa,bb,cc;
        int mins=INF,minsa=a,minsb=b,minsc=c;
        for(int i=1;i<=10000;i++){
            aa=i;
            for(int j=1;;j++){
                bb=j*aa;
                if(bb>20050)break;
                for(int k=1;;k++){
                    cc=bb*k;
                    if(cc>20050)break;
                    sum=abs(a-aa)+abs(b-bb)+abs(c-cc);
                    if(sum<mins){
                        minsa=aa;
                        minsb=bb;
                        minsc=cc;
                        mins=sum;
                    }
                }
            }
        }
        cout<<mins<<endl;
        cout<<minsa<<' '<<minsb<<' '<<minsc<<endl;
    }
}

你可能感兴趣的:(Codeforces)