拼题A 跨年挑战赛 2024 赛后提交入口 + 题目 + 题解

26 篇文章 0 订阅
17 篇文章 0 订阅

赛后也想提交?点击进入 拼题A教育超市

周三,搞学长:“小柳进前十了!想要奖品过来拿!”

等了好几天的比赛结果终于出来了,四年来的跨年挑战赛第一次做满分,第一次进前十!(40分钟做完)

因为我已经在百腾教育工作了😂百腾教育和PAT考试中心联合发起的这次跨年挑战赛,所以我就不参与前十名的评奖和抽奖了。

获奖名单请关注“拼题A”微信公众号查看。

Top 1-5: PAT文化衫 + 《PAT程序设计能力考试备考通》一本
Top 6-10: 《PAT程序设计能力考试备考通》一本
10个幸运奖:拼题A周边礼物盲盒
20个幸运奖:PAT程序设计能力考试50元代金券

了解并报名【PAT程序设计能力考试】请点击 (patest.cn)

下面分享一下我的解题思路和题解:

因为最近比较忙,没有时间整理,所以就直接把题目和比赛时候提交的代码直接贴过来了(拼手速的比赛,格式不是很好,大家凑合着看)

点击进入拼题A&PAT QQ群(458320141)
在这里插入图片描述

跨年-1 特殊的年份

请找到一个最小的公元年份,使得该年份能同时被 23、11 和 8 整除。

冷知识:只要加上足够多的限制,任何年份都可以是一个特殊的年份。

输入格式:

该题没有输入。

输出格式:

输出一行,格式为 YYYY is a special year!

输入样例:

输出样例:

1999 is a special year!

提示:

请将样例输出中的 1999 替换为你得到的答案,样例并不正确。

2024 is a special year!

跨年-2 穿什么衣服

天~ 气~ 好~ 冷~……但你在温暖的家里,并不知道有多冷。

现在你要出门了,你发现:不知道该穿多少衣服。你决定查一查天气,根据温度决定穿多少衣服出门。

以下是妈妈给的参考清单:

温度穿什么衣服备注
[15, 30)听妈妈的(Mama)问问妈妈穿什么吧
[-10, 15)羽绒服(YuRongFu)穿件羽绒服吧
[-100, -10)不出门(Zhai)都这么冷了,还是在家待着吧

输入格式:

输出一行一个整数 C C C ( − 100 ≤ C < 30 -100 \le C \lt 30 100C<30),表示目前的温度。

输出格式:

输出当前的温度和该穿的衣服,用空格隔开。该穿的衣服输出上面表格中括号内的部分,注意区分大小写。

输入样例:

-8

输出样例:

-8 YuRongFu

if else
if < 10 宅
else if < 15 羽绒服
else 妈妈

#include <bits/stdc++.h>
using namespace std;
int main() {
	 int n;
	 cin>>n;
	 if(n<-10) {
	 	cout<<n<<" Zhai";
	 } else if(n<15) {
	 	cout<<n<<" YuRongFu";
	 } else {
	 	cout<<n<<" Mama";
	 }
}

跨年-3 按比例发奖

我猜你一定知道了,今年的团体程序设计天梯赛的个人奖改为按比例发奖,具体规则是:

  • 大于等于 175 分的选手颁发个人奖;

  • 所有符合上述规则的选手,按分数高低排名,按 1:3:6 的比例颁发个人一等奖、二等奖及三等奖。

为预先准备颁奖,你需要完成一个简单的计算程序。现在给出大于等于 175 分的选手人数及若干选手的实际排名,请依次输出他们的对应奖项级别。

输入格式:

输出第一行是两个正整数 N , M N, M N,M ( 10 ≤ N ≤ 1 0 5 , 1 ≤ M ≤ 100 10 \le N \le 10^5, 1 \le M \le 100 10N105,1M100),表示大于等于 175 分的选手的人数以及要询问奖项的选手人数。

接下来的 M M M 行,每行一个正整数 R i R_i Ri ( 1 ≤ R i ≤ N 1 \le R_i \le N 1RiN),表示询问奖项选手的排名。

为方便计算,我们保证 N N N 是 10 的倍数。

输出格式:

对于每个选手的排名,输出 1 , 2 , 3 1, 2, 3 1,2,3 中的一个,表示应该获得一等奖、二等奖还是三等奖。

输入样例:

100 10
1
10
11
30
40
41
60
61
99
100

输出样例:

1
1
2
2
2
3
3
3
3
3

(背景:今年天梯赛全国总决赛个人奖改为按比例发奖,对于分数大于等于175分的同学,按1:3:6发放全国总决赛个人一二三等奖,祝大家都能拿到全国总决赛个人奖!)

了解详情并报名请点击(【竞赛目录内的竞赛】CCCC中国高校计算机大赛 GPLT团体程序设计天梯赛)
(https://gplt.pintia.cn/)
由学校老师同一报名,如果学校没有组织,大家也可以向老师推荐一下

if else
if <= n * 0.1 一等奖
else if <= n * 0.4 二等奖
else 三等奖

#include <bits/stdc++.h>
using namespace std;
int main() {
	 int n,m;
	 cin>>n>>m;
	 int a=n*0.1,b=n*0.4,c=n;
	 while(m--) {
	 	int x;
	 	cin>>x;
	 	if(x<=a) {
	 		cout<<1<<endl;
		} else if(x<=b) {
			cout<<2<<endl;
		} else {
			cout<<3<<endl;
		}
	 }
}

跨年-4 骗钱的手机游戏

某个骗钱的手机游戏里的游戏角色的稀罕度总共有 9 个级别,从常见到罕见分别是:

R、R+、SR、SR+、SSR、SSR+、UR、UR+、LR

假设所有稀罕度后面有加号(+)的都需要消耗两个同等级的角色升到下一等级(例如 SR+ 升级到 SSR 需要消耗 2 个 SR+ 的角色),而没有加号的只需要消耗 1 个同等级的角色(例如 UR 升级到 UR+ 只需要一个 UR 角色),请给出将能升级的角色都升级后,每个稀罕度分别有几个角色。

为了给没玩过这类游戏的同学更好地解释题意,我们可以将角色升级理解为“大鱼吃小鱼”。例如:

对任意两条目前稀罕度是 R 的鱼,在一次升级后,其中一条会吃掉另外一条,你会获得一条稀罕度为 R+ 的鱼,另外一条就被消耗掉了。

同理,一个稀罕度为 R+ 的角色,在消耗两个稀罕度为 R+ 的角色后,可以变身为一个稀罕度为 SR 的角色。

注意 LR 不能再升级了。

输入格式:

输入一行 9 个非负整数,分别从常见到罕见给出 9 个等级的初始角色数量。

角色数量小于等于 1 0 7 10^7 107

输出格式:

输出一行 9 个非负整数,用空格隔开,表示升级后的角色数量。

输入样例:

1001 1002 900 899 799 700 601 501 400

输出样例:

1 2 0 0 0 1 0 0 743

不带加号的(第奇数个),除以2给下一个,输出对2取余。带加号的(第偶数个),除以3给下一个,输出对3取余。

搞学长:“小柳你这代码太不优雅了”
比赛时不想动脑子用循环😂所以就ctrl c v c v c v,大家不要学我,大家都要用循环来做!

#include <bits/stdc++.h>
using namespace std;
int main() {
	int a[10];
	for(int i=1;i<=9;i++) {
		cin>>a[i];
	}
	cout<<a[1]%2<<" ";
	a[2]+=a[1]/2;
	cout<<a[2]%3<<" ";
	a[3]+=a[2]/3;
	cout<<a[3]%2<<" ";
	a[4]+=a[3]/2;
	cout<<a[4]%3<<" ";
	a[5]+=a[4]/3;
	cout<<a[5]%2<<" ";
	a[6]+=a[5]/2;
	cout<<a[6]%3<<" ";
	a[7]+=a[6]/3;
	cout<<a[7]%2<<" ";
	a[8]+=a[7]/2;
	cout<<a[8]%3<<" ";
	a[9]+=a[8]/3;
	cout<<a[9];
}

跨年-5 找年兽

传统中,过春节需要打年兽。为了打败年兽,你得找到年兽。

请你在一个字符串里找到所有年兽。

输入格式:

输入在一行中给出一个字符串,只包含所有 ASCII 的可见字符,不包括回车。字符串长度不超过 1 0 4 10^4 104

输出格式:

输出一行两个数用空格隔开,第一个数字表示年兽的个数,第二个数字表示第一个年兽出现的位置。

年兽以Nian代表,字符串的位置从 0 开始。区分大小写。如果没有找到年兽,位置输出为 -1。

输入样例:

Jin Nian Ming Nian Dou Hui Wang Wang Wang! Nian nian you yu!

输出样例:

3 4

遍历字符串,可以学一下c++ string的substr()和find()函数

#include <bits/stdc++.h>
using namespace std;
int main() {
	string s;
	int n=0,p=-1;
	getline(cin,s);
	for(int i=0;i<s.length()-3;i++) {
		if(s[i]=='N'&&s[i+1]=='i'&&s[i+2]=='a'&&s[i+3]=='n') {
			n++;
			if(p==-1)p=i;
		}
	}
	cout<<n<<" "<<p;
}

跨年-6 新年烟花

新年来临,许多地方会举行烟花庆典庆祝。小 C 也想参加庆典,但不幸的是跟他一个想法的人实在太多,活动场地全是人人人人人人人人人……

活动场地可视作一个 N × M N \times M N×M 的矩阵,其中有一些格子是空的,另外有一些格子则被人或者建筑物占领了。烟花会在一些格子上开始燃放,一个空的格子是一个对小 C 而言的优秀的观赏位置,当且仅当这个格子能看到三个及以上不同格子上燃放的烟花。一个格子能看到一个燃放的烟花,指的是:

  • 格子与烟花在同一行或同一列;

  • 格子与烟花的连线上的所有格子,要不是空格子,要不格子上的任何物体的高度小于小 C 的身高。

现在给定活动场地的情况以及小 C 的身高,请找到所有对小 C 而言的优秀的观赏位置,并输出能看到最多的烟花的格子的坐标。

输入格式:

输入第一行是三个正整数 N , M , H N, M, H N,M,H ( 1 ≤ N , M ≤ 50 , 1 ≤ H ≤ 210 1 \le N, M \le 50, 1 \le H \le 210 1N,M50,1H210),表示活动场地矩阵大小为 N × M N \times M N×M,小 C 的身高为 H。

接下来的 N N N 行,每行 M M M 个整数,整数的含义如下:

  • 如果是一个正整数,则表示该格子被人或建筑物占据,高度为对应的值。

  • 如果是一个负整数,则表示该格子用于燃放烟花。所有燃放烟花的格子视为没有高度。

  • 如果是 0,则表示该格子是空格子。

所有整数的绝对值不超过 500。

输出格式:

输出第一行是一个正整数,表示对小 C 而言的优秀观赏位置有多少个。

接下来输出能看到最多的燃放烟花的格子的坐标 ( X , Y ) (X, Y) (X,Y),即格子在第 X X X 行、第 Y Y Y 列,数字间以 1 个空格分隔。当存在多组坐标时,只输出最小的那组,即输出 X X X 最小的解; X X X 相同时输出 Y Y Y 最小的解。

矩阵左上角坐标为 ( 0 , 0 ) (0, 0) (0,0) ,保证至少存在一个对小 C 而言的优秀观赏位置。

输入样例:

10 10 175
0 0 0 0 0 0 0 0 0 0
0 50 0 180 -100 180 0 70 30 0
0 30 0 0 300 0 0 0 0 0
0 250 0 0 -100 0 0 0 0 0
0 -100 174 0 0 0 0 169 -100 0
0 -100 0 0 0 0 0 0 -100 0
0 -1 0 0 170 0 0 0 0 0
0 5 0 0 300 0 0 0 0 0
0 20 0 0 -100 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

输出样例:

6
3 8

遍历二维数组,对每一个0,分别向上下左右找到大于等于h的第一个数为止,统计负数(烟花)个数。

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n,m,h,a[55][55],ma=0,maxx=0,may=0,c=0,best=0;
	cin>>n>>m>>h;
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			cin>>a[i][j];
		}
	}
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			if(a[i][j]!=0)continue;
			c=0;
			for(int ii=i-1;ii>=0;ii--) {
				if(a[ii][j]>=h)break;
				if(a[ii][j]<0)c++;
			}
			for(int ii=i+1;ii<n;ii++) {
				if(a[ii][j]>=h)break;
				if(a[ii][j]<0)c++;
			}
			for(int jj=j-1;jj>=0;jj--) {
				if(a[i][jj]>=h)break;
				if(a[i][jj]<0)c++;
			}
			for(int jj=j+1;jj<m;jj++) {
				if(a[i][jj]>=h)break;
				if(a[i][jj]<0)c++;
			}
			if(c>=3)best++;
			if(c>ma) {
				ma=c;
				maxx=i;
				may=j;
			}
		}
	}
	cout<<best<<endl<<maxx<<" "<<may;
}

跨年-7 奇因子之和

一个整数的因子,就是所有可以整除这个数的数。奇数指在整数中,不能被 2 整除的数。所谓整数 Z Z Z奇因子,就是可以整除 Z Z Z 的奇数。

给定 N N N 个正整数,请你求出它们的第二大奇因子的和。当然,如果该数只有一个奇因子,就用它唯一的那个奇因子去求和。

输入格式:

输入第一行给出一个正整数 N N N ≤ 1000 \le 1000 1000)。随后一行给出 N N N 个不超过 1 0 6 10^6 106 的正整数。

输出格式:

在一行中输出所有给定整数的第二大奇因子之和。

输入样例:

5
147 12 35 78 4

输出样例:

71

样例解释:

  • 147 的因子有 { 1、3、7、21、49、147 },第二大奇因子是 49;

  • 12 的因子有 { 1、2、3、4、6、12 },第二大奇因子是 1;

  • 35 的因子有 { 1、5、7、35 },第二大奇因子是 7;

  • 78 的因子有 { 1、2、3、6、13、26、39、78 },第二大奇因子是 13;

  • 4 的因子有 { 1、2、4 },只有一个奇因子,所以用 1 参与求和。

所以输出的答案是:49+1+7+13+1 = 71。

使用c++ stl的set,去重,有序
对每一个数找到所有奇数因子(使用复杂度O(sqrt(n))的算法找出所有奇因子,不然1000个不超过 1 0 6 10^6 106的数 1000 ∗ 1 0 6 1000*10^6 1000106会超时),存到set中找到第二大值并累加。(set的size如果是1则取最大奇因子)

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n,sum=0;
	cin>>n;
	while(n--) {
		int x;
		cin>>x;
		set<int>s;
		int sq=sqrt(x);
		for(int i=1;i<=sq;i++) {
			if(x%i==0) {
				if(i%2)s.insert(i);
				if((x/i)%2)s.insert(x/i);
			}
		}
		if(s.size()==1)sum+=(*s.begin());
		else {
			auto it=s.end();
			it--;it--;
			sum+=(*it);
		}
	}
	cout<<sum;
}

跨年-8 翻箱倒柜(复刻)

在这里插入图片描述

翻箱倒柜找东西大概是所有人头痛的事情。大部分人类在识别物体的时候,更容易识别颜色而不是大小的差异。所以当我们想从一大堆杂乱堆放的长方体盒子中找到我们需要的盒子时,根据颜色找比根据尺寸找要容易。现在的问题是,我们只知道尺寸不知道颜色…… 所以就要请你从这些盒子的记录中快速找出需要的盒子的编号及颜色。

输入格式:

输入第一行给出一个正整数 N N N ≤ 1 0 5 \le 10^5 105),为盒子的总数。随后 N N N 行,每行列出一只盒子的长、宽、高、颜色值。再后面是查询数量 K K K ≤ 100 \le 100 100),随后 K K K 行,每行给出一个需要查询的盒子的长、宽、高。

这里所有尺寸都是不超过 1 0 9 10^9 109 的正整数,颜色值按 RRR.GGG.BBB 格式给出,三个分值都在 [0, 255] 区间内。同一行中的数字以空格分隔。

题目保证给出的 N N N 只盒子的尺寸都不相同,即不存在两只盒子具有相同的长、宽、高。**注意:尺寸为 1、2、3 的盒子跟尺寸为 3、2、1的盒子是不同的。**盒子的编号按输入顺序从 1 开始递增编号。

输出格式:

对每个查询的盒子,在一行中按输入相同的格式输出其编号及颜色。如果这个尺寸的盒子不存在,则输出 Not Found

输入样例:

10
15 23 23 000.255.136
12 32 15 255.000.092
29 32 15 000.000.255
15 23 25 255.255.000
10 15 23 000.000.000
12 17 15 255.255.255
15 10 23 023.189.163
29 32 33 233.069.215
9 31 987 179.002.031
40 15 23 230.000.000
6
15 23 23
12 17 15
29 32 33
10 15 15
15 32 12
9 31 987

输出样例:

1 000.255.136
6 255.255.255
8 233.069.215
Not Found
Not Found
9 179.002.031

2023睿抗机器人开发者大赛CAIP-编程技能赛 高职组 初赛 题目的复刻版(只是输出多了一个index)
点击进入拼题A教育超市做做看(2023 Robocom CAIP 高职组 初赛)(1金币就可以,签到1天得5金币)

了解详情并报名请点击(【竞赛目录内的竞赛】睿抗CAIP赛道)编程技能赛 为程序设计竞赛(获奖比例很高!)
(https://www.robocom.com.cn/content.html?cid=732)
可以个人报名。报名暂未开始,将在近期开始,大家可以关注一下官网。

可以使用c++ stl的map,也可以使用二分
map[(长,宽,高)] = (index,颜色),然后使用map的find方法

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin>>n;
	map<string,string>m;
	for(int i=1;i<=n;i++) {
		string a,b,c,d;
		cin>>a>>b>>c>>d;
		m[a+"."+b+"."+c]=to_string(i)+" "+d;
	}
	cin>>n;
	while(n--) {
		string a,b,c;
		cin>>a>>b>>c;
		if(m.find(a+"."+b+"."+c)!=m.end()) {
			cout<<m[a+"."+b+"."+c]<<endl;
		} else {
			cout<<"Not Found"<<endl;
		}
	}
}
  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柳学渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值