题解:P13598 [NWRRC 2022] Absolutely Flat

· · 题解

1.题目思路

本题前置知识:分支结构、数组。

我们来分析一下可行和不可行的情况。

先来看可行的情况:

  1. 数列 a 最小值与最大值相等(即数列 a 的值都相等),可行;
  2. 数列 a 是最小值的只有一个数,且这个数与 b 相加等于数列最大值,可行。

再来看不可行的情况:

  1. 如果数列 a 中不同的数的个数大于 2,那么无论如何也不能使所有数都相等,不可行。
  2. 除上述可行与不可行情况的其他情况都不可行。

分析完成。我们用一个计数数组记录每个数出现的次数,再用一个计数变量记录不同数的个数,以及数列最大值、最小值变量便可以完成上述判断。

2.代码

注:本代码仅供参考。

:::info[代码]{open}

#include<iostream>
#include<cstdio>
using namespace std;
const int max_v=105; //a[i] 的最大值
int a[5],b,cnt,mina=2147483647,maxa;
int times[max_v]; //记录每个数出现的次数
int main(){
    for(int i=1;i<=4;i++){
        scanf("%d",&a[i]);
        if(!times[a[i]]){ //如果之前都没出现过,那么这是第一次出现,不同数的个数 +1
            cnt++;
        }
        times[a[i]]++;
        if(cnt>2){ //不同数个数多于 2,那么一定不可行
            puts("0");
            return 0;
        }
        mina=min(mina,a[i]); //最小值
        maxa=max(maxa,a[i]); //最大值
    }
    scanf("%d",&b);
    if(mina==maxa){ //数列所有数都相等
        puts("1");
    }
    else if(mina+b==maxa&&times[mina]==1){ //只有一个数与其他数不同,且满足条件
        puts("1");
    }
    else{ //其他情况都不可行
        puts("0");
    }
    return 0;
}

:::

3.后记

更多内容,请移步至:

  1. \color{red}\texttt{Luogu ryf2011}
  2. \color{orange}\texttt{cnblogs(博客园) cnblogs2011ryf}