构造mex(牛客周赛 Round 59)

news2024/11/27 0:45:39

题目链接;

D-构造mex_牛客周赛 Round 59 (nowcoder.com)

题目描述:

输出和输出描述:

输入样例:

3
6 3 3
7 4 3
6 6 0

输出样例:

NO
YES
4 0 1 2
YES
1 1 1 1 1 1

 分析:

数学思维题,赛后看了一下比率:182/3788。

对n和k的大小进行分类讨论:

n < k

n<k的情况一定输出是0,因为极端的情况下n最多能达到的是0 1 2 ... n - 1,到达不了k - 1,那么第一个没有的整数是: n,就不再是k了。

n == k

这个就是 0 1 2 ... n - 1,又因为n == k, 所以第一个没有的是整数就是n,也即是k,只需要判断前n项和是不是等于s的,也即是 s == (n - 1) * n / 2 ? "YES" : "NO";

例子:

s = 6, n = 4, k = 4

输出的是:

0 1 2 3  

n > k

对k的特殊情况进行讨论:

k == 0

k等于0的情况下,能组成的最小值是 1 * n,如果s小于最小值的话,那就是不可能的输出"NO",否则的话,可以先输出n-1个1,然后最后在输出最后一个 s - (n - 1)即可。

例子:

s = 11, n = 5, k = 0;

那么构造的是: 0 0 0 0 11

k == 1

k等于1的情况下,能组成的最小值是0(n个0)。

但是要注意s等于1就要输出"NO"了,因为我输出n-1个0,最后在输出一个1,但是这个1和k一样,因此我想把这个1换成2或者0,但是发现换为0的那么就需要一个0去加1,换为2的话,就需要一个0减去1,那么就变味负的了,因此输出"NO"

例子:

s = 1, n = 4, k = 1

输出的是: "NO"

s不等于1的时候,可以先输出n-1个0,然后在输出最后一个 s - (n - 1) * 0。

例子:

s = 3, n = 4, k = 1

输出的是: 0 0 0 3 

k == 其他

这个是最复杂的情况了。k等于其他(2, 3, 4, ....)的情况下的最小值是: (0 1 2 .....k - 1 0 0 0 0 0 0 )也即是 (k - 1) * k / 2 + (n - k) * 0,要是当前的s小于这个最小值的话直接输出"NO"。

先去分配0 到 (k - 1)这n个数,那么还剩下和为:s- k * (k - 1) / 2, n - k个数。

贪心的做法:先分配 n - k - 1个0,在把最后一个数的值为s- k * (k - 1) / 2。但是需要注意的是 这个值是不是等于k的。

要是等于k的话就出现了k,我就会让这个最后一个数减去1,然后让1到k-1后面的0 0 0 0 中任意一个0改为1即可,但是需要注意的是,1到k-1的后面有没有0,没有的话就不可以。

例子:

s = 9, n = 4, k = 4

输出的是:

按照之前的思路输出的是 

0 1 2 3 4,但是发现出现了4,因此我就会让4减去1,然后让蓝色部分的一个0加上1,但是发现蓝色部分没有0的出现,因此正确的输出是"NO",那可不可以让红色部分的某一个加1,当然不可以,红色部分某一个加1了,第一个没有的整数就不再是k了。

例子:

s = 9, n =10, k = 4

刚开始构造的是:

0 1 2 3 0 0 0 0 0 4

出现了k,因此我会让蓝色部分的第一个0加1,让最后这个数-1即可,也就是变为了:

0 1 2 3 1 0 0 0 0 3

要是不等于k的话,无论是大于还是小于直接输出即可。

例子:

s = 8, n = 10, k = 4 

输出的是:

0 1 2 3 0 0 0 0 0 2 

代码:

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"

using namespace std;

signed main() {
	int t;
	cin >> t;
	while(t -- ) {
		int s, n, k;
		cin >> s >> n >> k;
		if(n == k ){
			if(s != (n - 1) * n / 2) {
				cout << "NO" << endl;
			} else {
				cout << "YES" << endl;
				for(int i = 0; i < n; i ++ ) {
					cout << i << " ";
				}
				cout << endl;
			}
			continue;
		}
		if(n < k ) {
			cout << "NO" << endl;
		} else {
			int a[n + 10];
			if(k == 0) {
				if(s < 1 * n) {//最小是 n * 1 
					cout << "NO" << endl;
				} else {
					cout << "YES" << endl;
					for(int i = 1; i <= n - 1; i ++ ) {
						cout << 1 << " ";
					}
					cout << s - (n - 1) << endl;
				}
			} else if(k == 1) {
				if(s == 1) {
					cout << "NO" << endl;
				} else {
					cout << "YES" << endl;
					for(int i = 1; i <= n - 1; i ++ ) {
						cout << 0 << " ";
					}
					cout << s << endl;
				}
			} else {
//				cout << "sum = " << k * (k - 1) / 2 << endl;
//				cout << "s = " << s << endl;
				// 最小是 k * (k - 1) / 2
				if(s < k * (k - 1) / 2 + 0 * (n - k)) {
					cout << "NO" << endl;
				} else {
					int b[n + 10];
					//k个了 
					for(int i = 0; i <= k - 1; i ++ ) {
						a[i] = i;
					}
					int sum = s - (k - 1) * k / 2;
					int gs = n - k; // 剩余的个数 
					//cout << "sum = " << sum << " gs = " << gs << endl;
					for(int i = 1; i <= gs - 1; i ++ ) {
						b[i] = 0;
					}
					b[gs] = sum;
					if(sum == k) {
						if(gs == 1) {
							cout << "NO" << endl;
							continue;
						}
						b[1] = 1;
						b[gs] = sum - 1;
					}
					cout << "YES" << endl;
					for(int i = 0; i <= k - 1; i ++ ) {
						cout << a[i] << " ";
					}
					for(int i = 1; i <= gs; i ++ ) {
						cout << b[i] << " ";
					}
					cout << endl;
				}
			}
		}
	}
	return 0;
}

 运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Bus:实现分布式系统中的消息传递与状态同步

在分布式系统中&#xff0c;服务之间的消息传递和状态同步是一个关键需求。Spring Cloud Bus提供了一个轻量级的消息代理连接分布式系统的节点&#xff0c;用于广播状态更改或管理指令。本文将探讨Spring Cloud Bus的功能、使用场景及其在分布式系统中的作用。 Spring Cloud B…

【星汇极客】STM32 HAL库各种模块开发之1.8TFT屏幕

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

Node.js+Express毕设论文选题最新推荐题目和方向

目录 一、前言 二、毕设选题推荐 三、总结 四、附录&#xff08;手册、官网、资源教程等&#xff09; 1. Node.js 官方资源 2. Express 官方资源 3.安装方法 4 创建示例 一、前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者使用…

ARM知识点三和串口代码的编写流程

ARM的一些常见问题 ARM 体系结构的主要特点是什么&#xff1f; 精简指令集 (RISC)&#xff1a;ARM 采用 RISC 结构&#xff0c;指令集较小且简单&#xff0c;执行效率高。相比于复杂指令集 (CISC)&#xff0c;RISC 更强调每条指令的执行速度。低功耗设计&#xff1a;ARM 处理…

在北京能不能设计一款可以多屏展示的调度桌

在北京这座科技与创新并蓄的国际大都市&#xff0c;设计一款集高效、智能与多屏展示功能于一体的调度桌&#xff0c;不仅是一个技术挑战&#xff0c;更是对未来工作场景的一次深刻探索与重塑。那么&#xff0c;在北京能不能设计一款可以多屏展示的调度桌呢? 随着信息技术的飞速…

实现MySQL异地多活场景

作为现代化的互联网企业 &#xff0c;最怕的是什么 &#xff1f;是意外&#xff01;由各种意外导致的数据库问题&#xff0c;磁盘问题、网络问题、人员误操作问题等等&#xff0c;这些问题都可能导致数据不可用或者丢失&#xff0c;造成重大损失。 因此&#xff0c;很少会有企…

【吊打面试官系列-微服务面试题】微服务架构有哪些优势?

大家好&#xff0c;我是锋哥。今天分享关于【微服务架构有哪些优势&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 微服务架构有哪些优势&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构是一种软件架构风格&#xff0c;将单…

“Flash 闪存”基础知识及 “SD NAND Flash”产品测试指南

目录 “Flash 闪存”基础知识及 “SD NAND Flash”产品测试指南一、“FLASH闪存”是什么&#xff1f;1. 简介2. 分类3. 特点4. 虚拟化 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程1. STM32F103读写代码…

CorelDRAW中绘制居民地街道区道路网的绘制

居民地街区道路网的绘制 1.打开软件&#xff0c;点击【文件】→【新建】&#xff0c;建立实验。并导入底图&#xff0c;结果如图1所示&#xff1a; 图1 2.点击【手绘工具】&#xff0c;利用贝塞尔曲线绘制主干道&#xff0c;结果如下图2所示 图2 3.点击【手绘工具】&#xf…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第二十七章 交叉编译器的安装和使用

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

前后端分离开发YApid

开头先声明以下&#xff0c;这篇主要用于概念的介绍…… 在当今的互联网应用开发中&#xff0c;前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发&#xff0c;这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…

浏览器内置文字转语音,播报功能Web Speech API - SpeechSynthesisUtterance

SpeechSynthesisUtterance: 让网页说话的艺术 在现代Web开发中&#xff0c;让网页具有语音功能可以极大提升用户体验&#xff0c;特别是对于视障用户或需要多任务处理的场景。SpeechSynthesisUtterance 是 Web Speech API 中的一个接口&#xff0c;它允许开发者创建一个语音合…

初学java练习题【1】

import java.util.Scanner;public class HelloWorld{public static void main(String[] args){Scanner scannernew Scanner(System.in);//输入工资System.out.println("请输入您的工资&#xff1a;");double d1scanner.nextDouble();System.out.println("请输入…

Word 批注如何添加及删除?只需这样就行

在使用 Word 编写文档之后我们可能会将其发送给其他伙伴查看&#xff0c;当其看见文档中有错误的时候可能需要加以标记&#xff0c;这样你才能知道哪里有错误。Word 批注功能就是这样的一种工具&#xff0c;它允许用户在文档中标记特定文字或段落&#xff0c;并添加相关评论或建…

【论文阅读】Semi-Supervised Few-shot Learning via Multi-Factor Clustering

通过多因素聚类的半监督小样本学习 引用&#xff1a;Ling J, Liao L, Yang M, et al. Semi-supervised few-shot learning via multi-factor clustering[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022: 14564-14573. 论文地址…

微软已解决Word自动删除文件问题 重启或使用命令行可修复

早前作为办公软件主力产品的 Microsoft Word 出现某个错误&#xff0c;该错误会导致用户在保存文件后或者关闭 Word 时自动删除文件&#xff0c;好在文件只是被移动到回收站中而不是永久删除。 该问题主要影响以下行为&#xff1a; 文件名中包含 # 号 文件后缀为全大写的.DOC…

应对网络安全挑战:App等保测评的重要性与策略

在全球数字化转型的大潮中&#xff0c;移动应用(App)作为连接人们日常生活与互联网世界的桥梁&#xff0c;其数量与日俱增&#xff0c;功能日趋多样化。与此同时&#xff0c;App背后潜藏的网络安全风险也随之上升&#xff0c;数据泄露、隐私侵犯、恶意软件植入等问题频发&#…

访问控制列表(课内实验)

实验2&#xff1a;访问控制列表 实验目的及要求&#xff1a; 通过实验&#xff0c;进一步的理解标准ACL与扩展ACL的工作原理及执行过程。理解通配符的概念&#xff0c;熟练掌握标准ACL与扩展ACL的配置指令&#xff0c;掌握将访问控制列表应用VTY线路上&#xff0c;并且能够判断…

C++网络编程之套接字基础

概述 在网络编程中&#xff0c;套接字&#xff08;Socket&#xff09;是一种用于进程间通信的接口。套接字是操作系统提供的一种抽象层&#xff0c;它允许不同计算机之间的进程通过网络进行通信。套接字实际上并不神秘&#xff0c;简单来说&#xff0c;套接字是连接网络中不同主…

【射频通信电子线路第七讲】射频收发信机结构及具体的实例应用

一、射频收发器 &#xff08;一&#xff09;功能与需求 &#xff08;1&#xff09;频率变换&#xff1a;调制解调、混频、不同于信息变换 电平变换&#xff1a;放大、衰减 干扰抑制&#xff1a;滤波、抵消 &#xff08;2&#xff09;发射出的信号&#xff1a;高频、一定功…