2020 NHOI小学(C++)

news2024/11/30 8:31:22

A. 房间数(2020 NHOI小学 1)

题目描述

有n个学生去参加CSP比赛,一个房间最多可以住3人,问至少需要多少个房间才能住得下n个学生?

输入格式

一个整数n。1<=n<=10^9

输出格式

一个整数。

输入/输出例子1

输入:

4

输出:

2

题意

一个房间最多可以住3人,问:至少需要多少个房间才能住得下n个学生?

思路

如果可以整除3,则n/3即可;如果不能整除3,n/3+1

请注意:如果使用向上取整函数,则务必进行强制类型转换为int,不然数据超过10^6106,就会转换为科学计数法

参考代码

#include <bits/stdc++.h>
using namespace std;
int n; 
int main(){
	cin>>n;
	cout<<(int)ceil(n/3.0);//向上取整 
	return 0;
}

B. 传染病(2020 NHOI小学 2)

题目描述

有一种病毒传染性非常强。一开始只有1个人感染了这个病毒,这个人成为第一代感染者。第一代感染者会传染给3个健康人,使得这3人变成第二代感染者。第二代的每个感染者又分别会传染3个健康的人,所以第三代感染者共有9人,...以此类推。问到了第几代感染者之后,总共的感染人数会超过a人?

输入格式

一个整数a。a≤10^12。

输出格式

一个整数。

输入/输出例子1

输入:

15 

输出:

4

样例解释

第一代感染者有1人,第二代感染者有3人,第三代感染者有9人,第四代感染者有27人。

可以发现,即使到了第三代感染者,所有感染人数=1+3+9=13,没有超过15人,所以要等到第四代感染者,才会使得总的感染人数超过15,所以答案是4。

题意

一传三,三传九...问:多少代之后会超过给定的数目?

思路

第一代1个,第二代3个,第三代9个,.。。可以使用累乘 和 累加 ,不断积累个数,判断比较是否超过指定 数量即可

参考代码

#include<bits/stdc++.h>
using namespace std;
long long a, t=1, s;//累乘初始化为1 
int main() {
	cin>>a;
	for(int i=2;;i++){
		t *= 3;//累乘 
		s += t;//累加 
		if(s>a){//如果达到要求 
			cout<<i;
			return 0;
		}
	}
	
	return 0;
}

C. 好数组(2020 NHOI小学 3)

题目描述

给出一个包含n个元素的数组a[1..n],数组的每一个元素都是正整数。现在首先把a数组从小到大排序,然后观察a数组所有的相邻的两个数,如果存在相邻的两个数的差超过1,那么a数组就是“坏数组”,否则是“好数组”。如果是“好数组”输出“YES”,否则输出“NO”。

输入格式

多组测试数据。

第一行,一个整数T,表示有T组测试数据。1<=T<=1000。

每组测试数据格式如下:

第一行,一个整数n。 1<=n<=50。

第二行,n个整数,第i个整数是a[i],其中1<=a[i]<=100。

输出格式

共T行,每行一个字符串,"YES"或者"NO"

输入/输出例子1

输入:

5

3

2 1 2

4

5 5 5 5

3

4 1 2

4

4 4 1 3

1

100

输出:

YES

YES

NO

NO

YES

题意

总共T组测试数据,每组测试数据包含一个整数n和n个数组元素。

数组所有的相邻的两个数,如果存在相邻的两个数的差超过1,那么a数组就是“坏数组”,否则是“好数组”

问:如果是好数组就输出“YES”,否则输出“NO”

思路

枚举,输入每组数据后,进行排序,然后判断相邻两个元素是否符合条件即可 时间复杂度O(T*nlogn) 注意的是:输出要换行、比较相邻两个元素时注意范围

参考代码

#include<bits/stdc++.h>
using namespace std;
int T, n, a[1005];
bool flag;
int main() {
	cin>>T;
	while(T--) {
		cin>>n;
		for(int i=0; i<n; i++)
			cin>>a[i];
		sort(a,a+n);//排序 
		flag=1;
		for(int i=0; i<n-1; i++) 
			if(a[i+1]-a[i]>1) {//相邻元素比较 
				flag=0;
				break;
			}
		
		if(flag)//符合条件,换行输出 
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

D. 最小乘积(2020 NHOI小学 4)

题目描述

给定4个整数:a,b,x,y。刚开始a>=x,b>=y。你可以做如下操作不超过n次:

每次你可以选择a或者b,然后让它的值减少1;不过你要保证本次操作之后a的值不能小于x且b的值不能小于y。

问最多n次操作之后,a*b的最小值是多少?

输入格式

多组测试数据。

第一行,一个整数T,表示有T组测试数据。1<=T<=20000。

接下来有T行,每行5个整数:a,b,x,y,n。1<=a,b,x,y,n<=10^9。

输出格式

共T行,每行一个整数。

输入/输出例子1

输入:

7

10 10 8 5 3

12 8 8 7 2

12343 43 4543 39 123212

1000000000 1000000000 1 1 1

1000000000 1000000000 1 1 1000000000

10 11 2 1 5

10 11 9 1 10

输出:

70

77

177177

999999999000000000

999999999

55

10

题意

给出T组测试数据,每组测试数据有5个整数:a,b,x,y,n,每次可以选择a或者b,然后让它的值减少1;不过你要保证本次操作之后a的值不能小于x且b的值不能小于y。

问:最多n次操作之后,a*b的最小值是多少?

思路

每次操作减一,共n次操作,所以可以先判断n是否超过a-x 和 b-y的 和,如果超过或等于,那最小值就是x*y

其次,去思考n 和 a-x 以及 n 和 b-y之间的大小关系,求出最小值即可

请注意: 定义long long,输出换行

参考代码

#include<bits/stdc++.h>
#define ll long long//重定义ll为 long long 
using namespace std;
ll pd(ll a,ll b,ll x,ll y,ll n) {
	ll l=a-x,r=b-y;//计算差值 
	ll s1=1e18,s2=1e18,s3=1e18,s4=1e18;//初始化 
	if(n>=(l+r)) //思路的第一种情况 
		return x*y;
	if(n>=l) //如果n 大于a-x,把a减少到 x 
		s1=x*(b-(n-l));
	if(n>=r)
		s2=y*(a-(n-r));
	s1=min(s1,s2);
	if(n<r)
		s3=a*(b-n);
	if(n<l) //如果n小于 a-x,把a减少 n 
		s4=b*(a-n);
	s3=min(s3,s4);
	return min(s1,s3);
}
ll t, a, b, x, y, n;
ll sum;
int main() {
	cin>>t;
	while(t--) {
		cin>>a>>b>>x>>y>>n;
		cout<<pd(a,b,x,y,n)<<endl;		
	}
	return 0;
}

E. 恢复数组(2020 NHOI小学 5)

题目描述

有一个数组a[1..n],但是这个数组的内容丢失了,你要尝试恢复它。已知以下的三个事实:

1、对于1<=i<=n,都有a[i]>0,且所有的a[i]互不相同。即a数组保存的全部都是正整数,且互不相同。

2、x和y一定是属于数组a,且x<y。

3、a数组是递增的数组,且相邻两项的差是相等的。即数组a是等差数列。

容易发现,同时满足上面三个条件的a数组不一定是唯一的。你要输出使得a[n]的值最小的那个a数组。

输入格式

多组测试数据。

第一行,一个整数T,表示有T组测试数据。1<=T<=100。

接下来有T行,每行3个整数:n,x,y。2<=n<=50。1<=x,y<=50。

输出格式

共T行,每行n个整数。

输入/输出例子1

输入:

5

2 1 49

5 20 50

6 20 50

5 3 8

9 13 22

输出:

1 49

10 20 30 40 50

20 26 32 38 44 50

3 8 13 18 23

1 4 7 10 13 16 19 22 25 

题目分析

题目要求我们根据给定的条件恢复一个丢失的数组 a[1..n],并且使得数组 a[n] 的值最小。已知条件如下:

数组 a 中的所有元素都是正整数且互不相同。 x 和 y 是数组中的元素,且 x < y。 数组 a 是一个递增的等差数列。

代码思路

输入处理:首先读取测试数据的组数 T,然后对于每组测试数据,读取 n、x 和 y。 初始化:对于每组测试数据,初始化一些变量用于记录最小值和等差数列的公差。 生成等差数列:通过双重循环生成可能的等差数列,并检查是否满足条件(包含 x 和 y)。 更新最小值:如果生成的等差数列满足条件且 a[n] 的值比当前记录的最小值小,则更新最小值和相应的等差数列。 输出结果:最后输出满足条件的等差数列。

考察的算法

暴力枚举:通过双重循环枚举可能的起始值和公差,生成等差数列并检查是否满足条件。 条件判断:在生成等差数列的过程中,检查数列是否包含 x 和 y,并且确保数列是递增的等差数列。 最小值更新:在满足条件的等差数列中,选择使得 a[n] 最小的数列。

总结

该题目主要考察了暴力枚举和条件判断的能力,通过生成和检查等差数列来找到满足条件且 a[n] 最小的数组。

代码

#include<bits/stdc++.h> 
using namespace std; 
long long a,b,c,d,s1,x[1000],z,c,s; 
int main() {
    scanf("%d",&a); // 读取测试数据组数 
    for(int i=1;i<=a;i++){ 
        scanf("%d%d%d",&b,&c,&d); // 读取每组测试数据的 n, x, y 
        s1=10000000,z=10000000,c=10000000; // 初始化变量 
        for(int j=1;j<=c;j++){  // 尝试不同的起始值 
            x[1]=j; // 设置等差数列的第一个元素 
            for(int k=1;k<=d-c;k++){ // 尝试不同的公差 
                s=0; 
                if(x[1]==c)s++; // 检查第一个元素是否等于 x 
                for(int l=2;l<=b;l++) { 
                    x[l]=x[l-1]+k; // 生成等差数列 
                    if(x[l]==c|x[l]==d)s++; // 检查生成的数列是否包含 x 和 y 
                } 
                if(s!=2)continue; // 如果不包含 x 和 y,跳过 
                if(x[b]<s1){ // 如果当前数列的最后一个元素比记录的最小值小 
                    s1=x[b]; // 更新最小值 
                    z=j; // 记录起始值 
                    c=k; // 记录公差 
                } 
            } 
        }  
        x[1]=z; // 设置最终等差数列的起始值 
        for(int j=2;j<=b;j++) { 
            x[j]=x[j-1]+c; // 生成最终的等差数列 
        } 
        for(int j=1;j<=b;j++) { 
            printf("%d ",x[j]); // 输出等差数列 
        } 
        printf("\n"); 
    } 
    return 0; 
} 

F. 数字和(2020 NHOI小学 6)

题目描述

给定一个整数n,每次操作你能让n的值增加1。问至少需要多少次操作才能使得整数n的各位数字之和不超过s?

输入格式

多组测试数据。

第一行,一个整数T,表示有T组测试数据。1<=T<=20000。

接下来有T行,每行2个整数n和s。1<=n<=10^18。 1<=s<=162。

输出格式

共T行,每行一个整数。

输入/输出例子1

输入:

5

2 1

1 1

500 4

217871987498122 10

100000000000000001 1

输出:

8

0

500

2128012501878

899999999999999999

题意

给出T组测试数据,每组测试数据有2个整数:n 和s

每次操作你能让n的值增加1。问:至少需要多少次操作才能使得整数n的各位数字之和不超过s

参考代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, a[25];
int T, s;
int main() {
	cin>>T;
	while(T--){
		cin>>n>>s;
		ll k=0, t=0, x=0, y=0, ans=1;
		while(n){
			a[++t] = n%10;
			k += a[t];
			n/=10;			
		}
	
		if(k<=s)
			cout<<0<<endl;
		else {
			for(int i=t; i>0; i--) {
				if(s>a[i])
					s=s-a[i];
				else {
					x=i;
					break;
				}
			}
			for(int i=x; i>0; i--)
				ans *= 10;
			for(int i=x; i>0; i--)
				y=y*10+a[i];
				
			cout<<ans-y<<endl;
		}
	}
	return 0;
}

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

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

相关文章

通过金蝶云星空实现高效仓储管理

金蝶云星空数据集成到旺店通WMS的技术案例分享 在企业日常运营中&#xff0c;库存管理和物流调度是至关重要的环节。为了实现高效的数据流转和业务协同&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将金蝶云星空的数据无缝对接到旺店通WMS。本次案例聚焦于“调拨入库…

go结构体匿名“继承“方法冲突时继承优先顺序

在 Go 语言中&#xff0c;匿名字段&#xff08;也称为嵌入字段&#xff09;可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时&#xff0c;嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。 如果多个嵌入结…

丹摩|丹摩智算平台使用教学指南

本指南旨在为新用户提供一个详细的操作步骤和实用的入门指导&#xff0c;帮助大家快速上手丹摩智算平台。 一、平台简介 丹摩智算平台是一款强大的数据分析和计算平台&#xff0c;支持多种编程语言&#xff0c;提供丰富的数据处理和机器学习工具。无论您是数据分析师、开发者…

从网桥到交换机:技术演变与应用场景

交换机和网桥是网络基础设施中不可或缺的设备&#xff0c;它们都用于提升网络性能和连接网络节点。然而&#xff0c;两者在设计目的、功能范围和适用场景上存在诸多不同之处。本文将从功能、差异和相互关系的角度&#xff0c;探讨交换机与网桥在网络中的角色。 交换机的功能与特…

ollama部署bge-m3,并实现与dify平台对接

概述 这几天为了写技术博客,各种组件可谓是装了卸,卸了装,只想复现一些东西,确保你们看到的东西都是可以复现的。 (看在我这么认真的份上,求个关注啊,拜托各位观众老爷了。) 这不,为了实验在windows上docker里运行pytorch,把docker重装了。 dify也得重装: Dify基…

《String类》

目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法&#xff1a;按照字典序比较 4.1.3 int compareTo(Strin…

渗透测试笔记—Windows基础和病毒制作

声明&#xff1a; 学习视频来自B站up主 【泷羽sec】有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&am…

编辑Word文档时手滑没点保存怎么办

今天帮人打了份报告&#xff0c;关掉的时候手滑点错了地方没保存。当然我找回来了&#xff0c;也许会有人不知道怎么找回来&#xff0c;记录在这里供人参考。 一、通过“信息”页面的“管理版本”命令组的“恢复未保存的文档”命令调出未保存的文档 二、在调出的打开文件对话框…

【娱乐项目】基于cnchar库与JavaScript的汉字查询工具

Demo介绍 利用了 cnchar 库来进行汉字相关的信息查询&#xff0c;并展示了汉字的拼音、笔画数、笔画顺序、笔画动画等信息用户输入一个汉字后&#xff0c;点击查询按钮&#xff0c;页面会展示该汉字的拼音、笔画数、笔画顺序&#xff0c;并绘制相应的笔画动画和测试图案 cnchar…

vsftpd 的安装和应用(超详细!!!)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在计算机网络上进行文件传输的标准协议。它允许用户从一台计算机向另一台计算机上传或下载文件。FTP的工作原理涉及到客户端和服务器之间的交互&#xff0c;以及数据传输的过程。 一、FT…

Apifox 11月更新|支持发布多个文档站、文档站支持 Algolia 搜索配置、从返回响应直接设置断言

Apifox 新版本上线啦&#xff01;&#xff01;&#xff01; 在API管理和自动化测试的领域&#xff0c;工具的每一次更新&#xff0c;都意味着开发者和测试人员的工作效率将进一步提升。而11月的Apifox更新&#xff0c;再次为我们带来了几个重磅的新功能&#xff0c;助力提升文档…

关于音频 DSP 的接口种类以及其应用场景介绍

在音频系统中&#xff0c;DSP&#xff08;数字信号处理器&#xff09;扮演着重要角色&#xff0c;通常会通过不同的接口与音频系统中的其他组件&#xff08;如功放、扬声器、音频源等&#xff09;进行连接。以汽车应用场景为例&#xff0c;以下是一些常见的接口类型分类及其介绍…

Java多线程介绍及使用指南

“多线程”&#xff1a;并发 要介绍线程&#xff0c;首先要区分开程序、进程和线程这三者的区别。 程序&#xff1a;具有一定功能的代码的集合&#xff0c;但是是静态的&#xff0c;没有启动运行 进程&#xff1a;启动运行的程序【资源的分配单位】 线程&#xff1a;进程中的…

Python-链表数据结构学习(1)

一、什么是链表数据&#xff1f; 链表是一种通过指针串联在一起的数据结构&#xff0c;每个节点由2部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放下一个节点的指针&#xff09;。最后一个节点的指针域指向null&#xff08;空指针的意思&#xff0…

《心灵奇旅》观后感

1 这是一部能够给心灵带来慰藉的电影&#xff0c;或许在人生迷茫的时候&#xff0c;可以看一下&#xff0c;洗涤内心&#xff0c;换还自己一片净土。 影片的男主乔伊是一位音乐老师&#xff0c;他一直梦想着能够加入乐队演出。然而&#xff0c;在即将有机会出演时&#xff0c;他…

使用easyexcel导出复杂模板,同时使用bean,map,list填充

背景 在使用easyexcel导出时&#xff0c;如果遇到一个模板中同时存在 一部分是实体类中的字段&#xff0c;另外部分是列表的字段&#xff0c;需要特殊处理一下&#xff0c;比如下面的模板&#xff1a; 这里面 user&#xff0c; addr 是实体类&#xff08;或者map&#xff09…

3.22【计组】 流水线加法器

实验一 timescale 1ns / 1ps/* ALU模块实现两个32bit数的add、sub、and、or、not、slt功能&#xff0c; 但由于Nexy7输入口限制&#xff0c;将num1简化为8位&#xff0c;在过程中再extend成32位&#xff0c;num2作为内部wire自行赋值&#xff0c;此处赋为5 由于最后的结果在to…

漫谈推理谬误——错误因果

相关文章 漫谈推理谬误——错误假设-CSDN博客文章浏览阅读736次&#xff0c;点赞22次&#xff0c;收藏3次。在日常生活中&#xff0c;我们会面临各种逻辑推理&#xff0c;有些看起来一目了然&#xff0c;有些非常的科学严谨&#xff0c;但也有很多似是而非&#xff0c;隐藏了陷…

实现 vue3 正整数输入框组件

1.实现代码 components/InputInteger.vue <!-- 正整数输入框 --> <template><el-input v-model"_value" input"onInput" maxlength"9" clearable /> </template><script lang"ts" setup> import { ref …

Hot100 - 搜索二维矩阵II

Hot100 - 搜索二维矩阵II 最佳思路&#xff1a; 利用矩阵的特性&#xff0c;针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系&#xff0c;逐步缩小搜索范围&#xff0c;从而达到较高的效率。 从右上角开始&#xff1a;假设矩阵是升序排列的&a…