Codeforces Round #644 (Div. 3)(A~G)

在这里插入图片描述
在这里插入图片描述
给出两个大小一致的 n m n*m 大小的矩形,不能重叠,找出一个的正方形可以把他们圈起来,求正方形面积至少为多少
两个矩形拼一起,要么是长对长,要么是长对宽,两者取最小面积就好了

void solve(){
    ll a,b;
    scanf("%lld %lld",&a,&b);
    ll ans = min(a,b);
    ans *= 2;
    ans = max(ans,max(a,b));
    cout << ans*ans <<endl;
}

在这里插入图片描述
在这里插入图片描述
给出一个数组,要求分成两份,一份找一个最大值,一份找一个最小值,求出大小差别的绝对值最小为多少
对于两份内元素个数没有要求,那就直接找出距离最近的俩数,然后一个成为某一份的最大值,另一个成为另一份的最小值就好了
直接 s o r t sort 一遍,找出相邻的数最小差别就可以了

void solve(){
    int n = read();
    rep(i,1,n){
        arr[i]=read();
    }
    sort(arr+1,arr+n+1);
    int ans = INF;
    rep(i,2,n){
        ans = min(ans,abs(arr[i]-arr[i-1]));
    }
    cout<<ans<<endl;
}

在这里插入图片描述
在这里插入图片描述
定义一种关系,两个数如果奇偶性一直,或者两个数相邻(大小只相差1)
那么这两个数被称为相似的
给出一个长度为n的序列(n为偶数),求问是否可以分组,使得每一组的俩数都是相似的,
刚开始读错题意了,,以为要分成两大组,卡了半天看不懂样例,后来才明白是可以分成很多组的,,每组只要内部符合条件就好了(每组大小为2)
首先我们知道,如果奇数的个数是偶数个,那么偶数的个数也会是偶数个 这样就直接按照奇偶性直接分就好了
如果不是偶数,那么就需要找出一个奇数一个偶数使得相邻就好了,
所以要么奇数有偶数个,要么奇数存在与一个偶数相邻的情况,那就成立,所以就直接写了

void solve(){
    int n = read();
    int n1=0;
    rep(i,1,n){
        arr[i]=read();
        if(arr[i]&1){
            n1++;
        }
    }
    sort(arr+1,arr+n+1);
    int f = 0;
    rep(i,2,n){
        if(arr[i]-arr[i-1]==1){
            f=1;
            break;
        }
    }
    if(n1%2==0||f){
        puts("YES");
    }else{
        puts("NO");
    }
}

在这里插入图片描述
在这里插入图片描述
给出俩数n,k,要求从1到k中找出一个数,使得这个数乘于一定倍数刚好为n
要求是这个倍数尽可能地小
其实就是一个枚举因子的题目,找出小于等于k的数中n的最大因子
注意这个题数据范围有点大…所以在枚举因子的时候,注意优化优化就好了

void solve(){
    ll n , k;
    scanf("%lld %lld",&n,&k);
    ll ans;
    for(ll i =1 ;i*i<=n&&i<=k;i++){
        if(n%i==0){
            if(n/i<=k){
                ans=i;
                break;
            }else{
                ans=n/i;
            }
        }
    }
    cout<<ans<<endl;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目太长了。。。
读不懂,我是看样例猜题意过的
大意应该是给出炮弹落地的规律,以及炮台的初始位置
给出最终炮弹落地的位置图,求问是否合法
炮弹落地的规律是,向右or向下,遇到炮弹或边界就停止,并落下
那就直接模拟吧
人为的给整个地图加一圈作为标记(标记为这个位置可以抵挡炮弹),然后从下向上,从右向左,对于每一个炮弹都看他是否合法(周围是否可以抵挡),是的话,这个点也变成可以抵挡的地方,最后再遍历是否有炮弹剩余,有的话就不合法
0代表空地,1代表炮弹,2代表这个点上边和左边可以合法落地炮弹
注意多组清空就好了

char str[100][100];
void solve(){
    ms(str,'0');
    int n;scanf("%d",&n);
    getchar();
    rep(i,1,n){
        scanf("%s",str[i]+1);
    }
    rep(i,1,n){
        str[n+1][i]='2';
        str[i][n+1]='2';
    }
    per(i,n,1){
        per(j,n,1){
            if(str[i][j]=='1'&&(str[i+1][j]=='2'||str[i][j+1]=='2')){
                str[i][j]='2';
            }
        }
    }
    rep(i,1,n){
        rep(j,1,n){
            if(str[i][j]=='1'){
                puts("NO");
                return;
            }
        }
    }
    puts("YES");
}

在这里插入图片描述
在这里插入图片描述
给出n个序列,每个序列长度均为m
每个序列最多可以改变一个位置的字符,求问每个序列改变一下,是否可以使所有的序列相同
没啥思路,直接暴力吧,数据范围小的可怜
我们直接枚举第一个字符串改变的位置,枚举每个位置,每个位置枚举26个字符,然后判断下其他各个字符串与这个改变后的字符串差别的地方是否均不大于1,是的话就可以,直接输出改变后的字符串就可以了
如果不可能的话,遍历完了输出-1

char str[100][100];
int n,m;
bool judge(char *ptr){
    rep(i,1,n){
        int cnt = 0;
        rep(j,1,m){
            if(str[i][j]!=*(ptr+j-1)){
                cnt++;
            }
        }
        if(cnt>1){
            return false;
        }
    }
    return true;
}
void solve(){
    scanf("%d %d",&n,&m);
    rep(i,1,n){
        scanf("%s",str[i]+1);
    }
    rep(j,1,m){
        char tmp = str[1][j];
        for(char ch='a';ch<='z';ch++){
            str[1][j]=ch;
            if(judge(str[1]+1)){
                puts(str[1]+1);
                return ;
            }
        }
        str[1][j]=tmp;
    }
    puts("-1");
    return;
}

在这里插入图片描述
在这里插入图片描述
要求构造出一个 n m n*m 的矩阵,每一行之和为 a a ,每一列之和为 b b ,每个位置只为 0 o r 1 0or1 ,可以构造就输出,反之输出No
这题我卡了好久,刚开始想的是记录下每一列目前写了几个1,然后排每一行,看是否可以排好,是的话就输出,
后来发现不对,我们假设是 5 5 5*5 ,每行每列都为 3 3
我们构造出

11100
11100
11100
00011
00011

然后输出no。。。这样其实是不对的,因为我们可以

11100
10011
01110
11001
00111

这样一来。。其实是可以构造出的
所以我们应该均匀排1,最后才可以

int arr[100][100];
void solve(){
    int n,m,a,b;
    ms(arr,0);
    scanf("%d %d %d %d",&n,&m,&a,&b);
    if(a*n != b*m){
        puts("NO");
        return ;
    }
    puts("YES");
    ms(arr,0);
    int pos = 0;
    rep(i,1,n){
        pos = (pos+1-1)%m+1;
        int cnt = 0;
        rep(j,pos,m){
            arr[i][j]=1;
            cnt++;
            pos=j;
            if(cnt>=a){
                break;
            }
        }
        if(cnt<a){
            rep(j,1,m){
                arr[i][j]=1;
                cnt++;
                pos=j;
                if(cnt>=a){
                    break;
                }
            }
        }
    }
    rep(i,1,n){
        rep(j,1,m){
            printf("%d",arr[i][j]);
        }
        puts("");
    }
}

猜你喜欢

转载自blog.csdn.net/leoxe/article/details/106339279
今日推荐