C. Cherry Bomb
题目解析
通过解析题目我们发现有以下这些情况:
(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<bits/stdc++.h>
using namespace std;
#define ll long long
void go()
{int n, k, t = 0;cin >> n >> k;vector<ll> 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;
}