Codeforces Round #709 (Div. 2, based on Technocup 2021 Final Round)(A~B)

A.Prison Break

如果有m*n个小房间,那么就有m*n个房间需要被打破,即每个房间至少要有一堵墙被打破。根据观察得出也不能是同一堵墙,故为m*n面墙需要被打破

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main(){
    scanf("%d",&t);
    while(t--){
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",a*b);
    }
    return 0;
}

B.Restore Modulo

先记录前两个相邻的数之间的差值为c。那么当后面出现两个相邻的数之间的差值和c不同且和c同号时,就不可能构成这个序列。若后面存在一个相邻差值和c不同但和c异号且此时m未定义过。则将m定义为abs(c)+abs(差值)。例如序列1,4,2.的差值分别为3和-2.那么m就为5,同时c(输出的答案)为3.因此这个序列存在的要求就是后面的差和c相等且同号或者异号时m未定义或者异号时差和c的绝对值的和等于m。如果没办法确切的求出m的值但是差值满足要求,那么m可以取任意值。输出0。如果不满足上述要求直接输出-1即可.最后需要注意下输出答案时需要判断下c是否为负。为负的话需要进行m-abs(c)这个操作后才是答案所要求的c的值。

AC代码如下:

#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
typedef long long ll;
int t,n,a[MAXN];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int m=-1,c=1e9+5,flag=1,max1=-1;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(a[i]>max1)
                max1=a[i];
        }
        if(n<3)
            printf("0\n");
        else{
            for(int i=0;i<n-1;i++){
                int temp=a[i+1]-a[i];
                if(temp>=0){//如果差值大于0 
                    if(c==1e9+5)//如果c没更新过,就更新c。这样就固定了差值 
                        c=temp;
                    else if(c<0&&m==-1){//如果c和temp异号,就可以求出m的值 
                        
                        m=abs(c)+temp;
                        if(m<=max1){//如果m小于最大值,则不可能 
                            printf("-1\n");
                            flag=0;
                            break;
                        }
                    }else if(c>=0&&m==-1){//如果c和temp同号,且m的值未求出来 
                        if(c==temp)
                            continue;
                        else{//如果c和temp不一样,就不行 
                            printf("-1\n");
                            flag=0;
                            break;
                        }
                    }else if(c>=0){//如果c和temp一样且m的值已经求出来了 
                        if(c!=temp){
                            flag=0;
                            printf("-1\n");
                            break;
                        }
                    }else if(c<0){//如果c和temp不一样且m的值已经求出来了 
                        if((m-abs(c))!=temp){
                            flag=0;
                            printf("-1\n");
                            break;
                        }
                    }
                }else if(temp<0){//如果差值小于0 
                    if(c==1e9+5)//如果c没更新过 
                        c=temp;
                    else if(c>0&&m==-1){//如果c更新过了且m未更新过且c和temp异号 
                        m=c+abs(temp);
                        if(m<=max1){//如果m小于最大的 
                            printf("-1\n");
                            flag=0;
                            break;
                        }
                    }else if(c<0&&m==-1){
                        if(c==temp)
                            continue;
                        else{
                            printf("-1\n");
                            flag=0;
                            break;
                        }
                    }else if(c==0&&m==-1){
                        printf("-1\n");
                        flag=0;
                        break;
                    }else if(c<0){
                        if(c!=temp){
                            flag=0;
                            printf("-1\n");
                            break;
                        }
                    }else if(c>=0)
                        if((m-c)!=abs(temp)){
                            flag=0;
                            printf("-1\n");
                            break;
                        }
                }
            }
            if(flag)
                if(m==-1)
                    printf("0\n");
                else
                    printf("%d %d\n",m,c>0?c:m-abs(c));    
        }
            
    }
    return 0;
}

 

posted @ 2021-03-25 21:33  mikku  阅读(41)  评论(0)    收藏  举报