贪心算法:排列算式

题目描述

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

输入描述:

复制代码
首行给出一个正整数t,(1≤t≤1000)代表测试数据组数

每组测试数据第一行一个正整数n,(1≤n≤500)

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

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

输出描述:

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

输入

复制代码
2
4
+3 +2 -1 -2
5
+3 +2 +1 +0 +2

输出

复制代码
Yes
No

说明

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

很显然第二组不存在满足要求的计算顺序
cpp 复制代码
#include <bits/stdc++.h>
#include<iostream>
using namespace std;
    int N, n, a[7], *cnt; 
    bool check() {
	int t = 0;
	for (int i = -3; i <= 3; i++) {
		t += i * cnt[i];
	}
	if (t > 3 || t < 0) 
        return false;
    t = min(cnt[-3], cnt[3]);
	cnt[-3] -= t;
	cnt[3] -= t;
	t = min(cnt[2], cnt[-1]);
	cnt[2] -= t;
	cnt[-1] -= t;
	cnt[1] += t;
	t = min(cnt[-3], cnt[1]);
	cnt[-3] -= t;
	cnt[1] -= t;
	cnt[-2] += t;
	if (cnt[-3] > 0) 
        return false;
	t = min(cnt[-2], cnt[1]);
	cnt[-2] -= t;
	cnt[1] -= t;
	cnt[-1] += t;
	t = min(cnt[3], cnt[-1]);
	cnt[3] -= t;
	cnt[-1] -= t;
	cnt[2] += t;	
	if (cnt[3] > 1) 
        return false;
	return true;
}
int main() {
	cin>>N;
	cnt = &a[3];
	while (N--) {
		memset(a, 0, sizeof(a));
		cin>>n;
		int t;
		for (int i = 1; i <= n; i++) {
			cin>>t;
			cnt[t]++;
		}
		if (check()) {
			cout<<"Yes\n";
		} else {
			cout<<"No\n";
		}
	}
	return 0;
} 
相关推荐
未来之窗软件服务几秒前
幽冥大陆(三十九)php二维数组去重——东方仙盟筑基期
android·开发语言·算法·php·仙盟创梦ide·东方仙盟·东方仙盟sdk
DFT计算杂谈4 分钟前
Abinit-10.4.7安装教程
linux·数据库·python·算法·matlab
sali-tec12 分钟前
C# 基于halcon的视觉工作流-章65 点云匹配-基于形状
开发语言·人工智能·算法·计算机视觉·c#
不会c嘎嘎19 分钟前
【C++】深入理解多态:从用法到原理
开发语言·c++
REDcker21 分钟前
软件开发者需要关注CPU指令集差异吗?
linux·c++·操作系统·c·cpu·指令集·加密算法
AI科技星24 分钟前
自然本源——空间元、氢尺、探针与场方程
数据结构·人工智能·算法·机器学习·计算机视觉
不知所云,33 分钟前
5. SDL3 库项目引入
c++·sdl3
小O的算法实验室33 分钟前
2025年CMAME SCI2区,基于优先级驱动搜索、具备动态候选解管理策略的粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
吃着火锅x唱着歌37 分钟前
LeetCode 2874.有序三元组中的最大值II
数据结构·算法·leetcode
C++ 老炮儿的技术栈41 分钟前
用密码学安全随机数生成256位密钥
c语言·开发语言·c++·windows·安全·密码学·visual studio