C. Cherry Bomb

C. Cherry Bomb_第1张图片

C. Cherry Bomb_第2张图片 题目解析

        通过解析题目我们发现有以下这些情况:

(1)输出0:

        数组a和数组b中有一个值超过了k。(包括所有已知的a[i]的值,还有所有已知的b[i]和未知的b[i])

        有两种不同的b[i] != -1的{a[i], b[i]}数对。(利用maxn 和minn来判断其中数对相不相同)

(2)输出1:

        只有一种{a[i], b[i]}数对,且不满足上述输出0的情况。

        有多个{a[i], b[i]}数对,但是他们的和都相同。

(3)输出其他值(b[i]全部都是-1):

        利用数学规律,输出的值只和a数组中的最大值maxa和最小值mina,以及k值有关。种类数为k - (maxa - mina) + 1;

代码

#include
using namespace std;
#define ll long long
void go()
{
    int n, k, t = 0;
    cin >> n >> k;
    vector a, b;
    for(int i = 0; i < n; i++){
        cin >> t;
        a.push_back(t);
    }
    for(int i = 0; i < n; i++){
        cin >> t;
        b.push_back(t);
    }
    //输出0的情况:(1)有一个值超过了k(2)b[i] != -1 中有两种情况不相同
    ll sum = 0, maxn = -1, minn =  1e9, maxa = -1, mina = 1e9;
    for(int i = 0; i < n; i++)
    {
        mina = min(mina, a[i]);
        maxa = max(maxa, a[i]);
        if(a[i] > k){
            cout << 0 <<"\n";
            return;
        }
        if(b[i] != -1)
        {
            sum++;
            maxn = max(maxn, a[i] + b[i]);
            minn = min(minn, a[i] + b[i]);   
        }
        if(maxn != minn && maxn != -1 && minn != 1e9)
        {
            cout << 0 << "\n";
            return;
        }
    }
    for(int i = 0; i < n; i++)
    {
        if((a[i] > maxn && maxn != -1) || (maxn - a[i] > k)){//a与b中有一个是大于k的情况
            cout << 0 << "\n";
            return;
        }
    }
    if(sum == 1)cout << 1 << "\n";
    else{
        if(maxn == minn)cout << 1 << "\n";
        else cout << k - (maxa - mina) + 1 << endl;
    }
    //输出1:只有一种b[i] != -1
    //输出多种的 b[i] 全部都是-1 输出k到maxa - mina

}
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        go();
    }   
    return 0;
}

你可能感兴趣的:(codeforces刷题,算法,c++)