本文主要是介绍cf Round #632 (Div. 2)B. Kind Anton,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:给你俩个数组a,b,其中数组a只包含{-1,0,1}中的元素,问数组a能不能通过以下操作变成B:
操作:将a[i]的值加给a[j]且可以重复多次(1<=i<j<=n)
思路:由于数组a最多只有三个元素-1,0,1那我们只需要比较a[i]和b[i],若a[i] < b[i]说明a[i]需要变大,三个元素中只有加上1才能使a[i]变大,因此需要数组a在第i个元素之前出现过1;同理,若a[i] > b[i] 需要在下标i之前出现过-1,若不满足以上俩个条件,则输出false。
以下是代码:
#include <iostream>
#include<set>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], b[maxn];
int main()
{int t;scanf("%d", &t);while(t--){multiset<int>ms;int n;scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &a[i]);}for(int i = 1; i <= n; i++){scanf("%d", &b[i]);}if(a[1] != b[1])//第一个元素不能变化,先特判一下{printf("NO\n");}else{bool flag = true;for(int i = 1; i <= n; i++){if(b[i] > a[i]){if(ms.find(1) == ms.end())//找不到1,则a不能变成b{printf("NO\n");flag = false;break;}}else if(b[i] < a[i]){if(ms.find(-1) == ms.end())//找不到-1,则a不能变成b{printf("NO\n");flag = false;break;}}ms.insert(a[i]);//把a[i]丢进去}if(flag)printf("YES\n");}}return 0;
}
这篇关于cf Round #632 (Div. 2)B. Kind Anton的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!