列表

详情


NC214860. 排列算式

描述

给出n数字,对于这些数字是否存在一种计算顺序,使得计算过程中数字不会超过3也不会小于0?

输入描述

首行给出一个正整数代表测试数据组数

每组测试数据第一行一个正整数

第二行包含n个以空格分隔的数字

输入保证每一个数字都是 −3, −2, −1, +0, +1, +2, +3 的其中一个。

输出描述

每组测试数据输出一行,“Yes” or “No”

示例1

输入:

2
4
+3 +2 -1 -2
5
+3 +2 +1 +0 +2

输出:

Yes
No

说明:

第一组依照 +3,−2,+2,−1 的顺序由左至右计算总和,过程会依序算得 3, 1, 3, 2,满足题目要求

很显然第二组不存在满足要求的计算顺序

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 5ms, 内存消耗: 376K, 提交时间: 2021-01-11 22:21:36

#include<bits/stdc++.h>
using namespace std;

unordered_map<int,int>V;
int main()
{
    int i,s,n,T;
    scanf("%d",&T);
    while(T--)
    {
    	scanf("%d",&n);
    	V.clear(),s=0;
    	while(n--)scanf("%d",&i),V[i]++;
		for(i=-3;i<=3;i++)s+=V[i]*i;
		if(s>3||s<0){printf("No\n");continue;}
		s=min(V[-3],V[3]);
		V[3]-=s,V[-3]-=s;
		s=min(V[2],V[-1]);
		V[2]-=s,V[-1]-=s,V[1]+=s;
		s=min(V[-3],V[1]);
		V[-2]+=s,V[-3]-=s,V[1]-=s;
		if(V[-3]){printf("No\n");continue;}
		s=min(V[-2],V[1]);
		V[-2]-=s,V[1]-=s,V[-1]+=s;
		s=min(V[3],V[-1]);
		V[3]-=s,V[-1]-=s,V[2]+=s;
		if(V[3]>1){printf("No\n");continue;}
		printf("Yes\n");
	}
    return 0;
}

上一题