2022.04.11(Educational Codeforces Round 126 (Rated for Div. 2))

Problem - A - Codeforces

说明:反正是要 最后的总和,那么肯定是在ai,ai+1,bi,bi+1四个数中最小的数和最小的数在一起,归根结底就是ab数组对应位置的上,小的数在a数组,大的数在b数组,如果不满足就交换位置

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
using namespace std;
const int maxx=1e5+10;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int a[maxx];
        int b[maxx];
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=0;i<n;i++){
            scanf("%d",&b[i]);
        }
        for(int i=0;i<n;i++){
            if(a[i]>b[i]){
                swap(a[i],b[i]);
            }
        }
        long long int sum=0;
        for(int i=0;i<n-1;i++){
            sum+=abs(a[i]-a[i+1]);
            sum+=abs(b[i]-b[i+1]);
        }
        printf("%lld\n",sum);
 
    }
}
View Code

Problem - B - Codeforces

说明:我们发现32768是2^15,那么最多也就是形成14个0,一个1,一直*2最多就是需要15步。那么加一最多也就是32768-n。如果再有最小的话就是最多加15个再乘2,如果边乘边加的话,那么刚构造出来的0还是没有意义的。那么我们直接去用15去模拟先+1、后*2的步数。

wa掉的点:

(1)首先想到二进制关于左移和+1的过程,又觉得肯定是看1与0的个数,可是这样有两个地方有问题:首先是很复杂,难以去模拟;再就是当初考虑的时候,想的太浅了,只想到个位往前一步,但是牵一发而动全身,这里也是错误的

(2)再就是知道了是15有关的数,结果肯定是比15小,那么为什么不用15去模拟呢?

(3)关于15没有想到,还是没深刻感受到,+1、*2必须是先+1后*2,消除1排列很多并且个位构成的0串很小的情况

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
using namespace std;
const int maxx=1e5+10;

int main(){
    int n;
    scanf("%d",&n);

    for(int i=0;i<n;i++){
        int j=0;
        int num;
        scanf("%d",&num);
        int minn=20;
        for(int k=0;k<=15;k++){
            int ns=(k+num)%32768;
            int sum=k;
            while(ns!=0){
                ns*=2;
                sum++;
                ns%=32768;
            }
            minn=min(minn,sum);
        }
        printf("%d ",minn);
    }

}
View Code

 

Problem - C - Codeforces

 说明:天数构成的1212121……,我们首先去分配奇数,奇数必有至少一个1,偶数我们先不考虑,这样的话我们先把1个1拿走,然后剩下的都是偶数,这样就可以比较一下1构成的2是不是可以满足剩下的那些偶数和

wa掉的点:

(1)无开long long

(2)老是去想哪天休息,其实这样的话会很乱,我们应该以1为主线,剩下的就都是2了,真的很妙

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxx=3e5+10;
int a[maxx]={0};
int n;
long long solve(int maxp){
    long long int ans=0;
    long long int sum=0;
    for(int i=0;i<n;i++){
        if((maxp-a[i])%2){
            ans++;
        }
        sum+=maxp-a[i];
    }
    return max(ans*2-1,sum/3*2+sum%3);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){

        scanf("%d",&n);
        int maxp=0;
        int sum=0;
        int ans=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            maxp=max(maxp,a[i]);
        }
        printf("%lld\n",min(solve(maxp),solve(maxp+1)));

    }
}
View Code

 

posted @ 2022-04-12 17:01  bonel  阅读(23)  评论(0编辑  收藏  举报