题解:P14101 [ZJCPC 2017] Problem Preparation

· · 题解

题目大意

n 道题目组成了一场比赛,第 i 道题目的难度为 s_i,这场比赛要满足以下条件就是被称作合法的

  1. 题目的数量要是 10 \sim 13(包括 1013

  2. 最简单的题目难度为 1

  3. 难度为 1 的题目至少有 2 道。

  4. 排序后,相邻的两道题目难度差不能大于 2(不包含最难的题目)。

题解

直接按照题意模拟即可,第二项和第三项可以合并,排序之后判断第一个和第二个是不是 1 和相邻两个的差是否小于等于 2 就可以了。

代码

//请读者自行跳转137行
#include <bits/stdc++.h>
#define For(i,x,y) for(ll i = x; i <= y; ++ i)
#define Down(i,x,y) for(ll i = x; i >= y; -- i)
#define gc() getchar()
#define pc(ch) putchar(ch)
#define MP(x, y) std::make_pair((x), (y))

typedef long long ll;
typedef double db;

const ll inf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;

inline ll read(){
    ll x = 0, f = 1;
    char ch = gc();
    while(ch < '0' || ch > '9'){
        if(ch == '-') f = -f;
        ch = gc();
    }
    while(ch >= '0' && ch <= '9'){
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = gc();
    }
    return x * f;
}

inline void print(ll x){
    if(x < 0){
        x = -x;
        putchar('-');
    }
    if(x == 0){
        putchar('0');
        return;
    }
    static int a[100];
    ll ans = 0;
    while(x){
        a[++ ans] = x % 10;
        x /= 10;
    }
    Down(i,ans,1){
        pc('0' + a[i]);
    }
}

inline void println(ll x){
    print(x);
    putchar('\n');
}

inline void printspa(ll x){
    print(x);
    putchar(' ');
}

template < typename... Args >

inline void printspa(ll x, Args... ArgTypes){
    printspa(x);
    printspa(ArgTypes...);
}

template < typename... Args >

inline void println(ll x, Args... ArgTypes){
    println(x);
    println(ArgTypes...);
}

inline ll Ksm(ll x, ll y, ll mod){
    ll Answer = 1;
    for(; y; Answer = (y & 1) ? (Answer * x % mod) : (Answer), y >>= 1, x = x * x % mod);
    return Answer;
}

inline ll Gcd(ll x, ll y){
    return ((y == 0) ? (x) : (Gcd(y, x % y)));
}

inline ll Gcd(ll x){
    return x;
}

template < typename... Args >

inline ll Gcd(ll x, Args... ArgTypes){
    return Gcd(x, Gcd(ArgTypes...));
}

inline ll Lcm(ll x, ll y){
    return x * y / Gcd(x, y);
}

inline ll Lcm(ll x){
    return x;
}

template < typename... Args >

inline ll Lcm(ll x, Args... ArgTypes){
    return Lcm(x, Lcm(ArgTypes...));
}

inline ll max(ll x, ll y){
    return (x > y) ? (x) : (y);
}

inline ll max(ll x){
    return x;
}

template < typename... Args >

inline ll max(ll x, Args... ArgTypes){
    return max(x, max(ArgTypes...));
}

inline ll min(ll x, ll y){
    return (x < y) ? (x) : (y);
}

inline ll min(ll x){
    return x;
}

template < typename... Args >

inline ll min(ll x, Args... ArgTypes){
    return min(x, min(ArgTypes...));
}

ll Diff[200]; 

int main(){
    ll T = read();
    while(T --){
        ll n = read();
        For(i, 1, n){
            Diff[i] = read();//输入难度 
        }
        std::sort(Diff + 1, Diff + n + 1);//排序
        if(n < 10 || n > 13){
            puts("No");
            continue;//判断题目数量 
        } 
        if(Diff[1] != 1 || Diff[2] != 1){
            puts("No");
            continue;//判断最简单的题目(2,3两项) 
        }

        bool p = true;

        For(i, 1, n - 2){
            if(Diff[i + 1] - Diff[i] > 2){
                p = false;
                break;
            } 
        }//判断差值 

        if(!p){
            puts("No");
            continue;
        }

        puts("Yes");
    } 
}