【NHOI2019】初中组模拟测试题目

这篇博客详细解析了NHOI2019初中组模拟测试的六道题目,涉及电话簿、扑克牌、计算缘份、数组元素、西樵山旅行和软件开发等多个算法与数据结构考点。每道题目均提供了解题思路,包括使用数组计数、字符串搜索、递归和二分动规等方法,同时附有示例代码。
摘要由CSDN通过智能技术生成

第一题:电话簿book

【题目描述】 
手头上的电话号码太多了,于是他决定要做一个电话簿。他所在地区的电话号码都是四位数字并且第一位不会是0或者8。 
稍微有一点点强迫症,他的电话簿前两页一定要写一点有趣的笑话,不然他绝对不想打开这个无聊的电话簿。所以,电话号码会从第三页开始记录。为了格式的美观(以及满足他的强迫症),每页最多可以记录k个号码并且一定要是同一个数字开头的。同一页中的号码需要按字典序从小到大排序。 
现在,小嘿嘿一笑,问你他的电话簿有多少页? 
【输入格式】 
第一行包含一个自然数K(0 < K < 255),表示每页最多可以有多少号码。 
第二行包含一个自然数N(0 < N < 8000),表示号码的数量。 
接下来N行,每行包含一个含有4个数码的数字(就是手机号码啦),以某种规则排序,并且不会重复。 
【输出格式】 
输出一行一个自然数,表示有多少页。 
【样例输入】 
5 
10 
1234 
5678 
1345 
1456 
1678 
1111 
5555 
6789 
6666 
5000 
【样例输出】 
5 

解题思路:这题考点是使用数组进行计数,因为题目要求是第一个数字的相同的电话号码才能够放在同一页,只需要定义一个a[15]数组用于标记电话号码中第一位数字出现的次数即可;都不需要排序,需要注意的一点是在判断首数字相同的电话号码可以放多少页的时候,需要求余每页放的号码数量,如果出现余数,则需要放多一页,除此之外,最后结果还要加2,因为是从第三页开始放电话号码。附代码如下:

#include <bits/stdc++.h>
using namespace std;
int k,n,a,num[15],ans=2;
int main(){
	cin>>k>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a;
		num[a/1000]++;
	}
	for(int i=1;i<=9;i++)
	{
		if(num[i]%k==0)
			ans=ans+num[i]/k;
		else
			ans=ans+num[i]/k+1;
	}
	cout<<ans; 
	return 0;
}

第二题 扑克牌(poker)

【题目描述】 
FJ有一副扑克,有52张牌,分为方块、梅花、红桃、黑桃,共4大类,每类都是有13张牌。我们用P表示方块类,用K表示梅花类,用H表示红桃类,用T表示黑桃类。每一类用数字01,02,03,......13 表示13张牌,那么方块类的13张牌就是:P01,P02,P03, ...P10,P11,P12,P13。同理,梅花类的13张牌就是:K01,K02,K03,...K10,K11,K12,K13。红桃类,黑桃类的也同理。 
FJ现在教Bessie认扑克牌,FJ给出一个字符串S,问字符串中是否有重复的扑克牌?如果有重复的扑克牌,Bessie要输出“GRESKA”。如果没有重复的扑克牌,如果FJ要把一副扑克的52张牌全部给Bessie的话,除了已经给了字符串S代表的扑克牌,还缺多少张方块牌?还缺多少张梅花牌?还缺多少张红桃牌?还缺多少张黑桃牌? 
【输入格式】 一个字符串S,表示FJ已经给了这些扑克牌给Bessie。字符串的每三个连续的字符表示一张扑克牌。S的长度不超过1000。 
【输出格式】 如果有重复的扑克牌,输出“GRESKA”(双引号不用输出)。 
否则输出4个整数,空格分开,分别表示还缺的方块扑克牌的数量、还缺的梅花扑克牌的数量、还缺的红桃扑克牌的数量、还缺的黑桃扑克牌的数量。 
输入样例: 
P01K02H03H04 
<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值