ACM 24届新生第一次周赛题解

        也是学了一段时间了,出了一场很简单的周赛题给新生,可以看出来新生之间的差距已经拉开了,感觉这一次的周赛新生最少最少写到7题才算是基本合格,这一场甚至签到题这么多,防AK也只是一个小思维还没人写出来,甚至还有暴零的情况,只能说是努力加油吧。

好好学习,好好补题。

难度等级

签到:5,9,11

简单:6,10,4,8

中等:1,2,7

困难:3

1.第一题

解题思路如下:

输入处理:读取测试用例的数量 𝑇 T 和每个矩阵的大小 𝑛 n 以及矩阵本身。注意数组索引从 1 开始。

右轴对称:对每一行进行右轴对称,打印原行内容后再打印该行的逆序内容。

下轴对称:在完成右轴对称后,重复打印过程,但行的顺序要从最后一行到第一行,以实现下轴对称。

输出格式:确保每组测试的输出之间没有额外的空行。

以下是基本步骤的总结:

使用双重循环读取矩阵。 使用两个循环打印右轴对称的矩阵,依次输出每行及其逆序。 通过另一个循环倒序打印实现下轴对称。 确保程序按要求输出,特别是避免多余的换行。 整体结构清晰,容易理解,适合处理

n 最大为 20 的情况。

#include <iostream>
using namespace std;
​
char a[22][22];
​
int main()
{
	int t;
	cin>>t;
	
	while (t--)
	{
		int n;
		cin>>n;
		
		for (int i=1;i<=n;i++)
		{
			for (int j=1;j<=n;j++)
			{
				cin>>a[i][j];
			}
		}
		
		for (int i=1;i<=n;i++)
		{
			for (int j=1;j<=n;j++)
			{
				cout<<a[i][j];
			}
			
			for (int j=n;j>=1;j--)
			{
				cout<<a[i][j];
			}
			
			cout<<"\n";
		}
		
		for (int i=n;i>=1;i--)
		{
			for (int j=1;j<=n;j++)
			{
				cout<<a[i][j];
			}
			
			for (int j=n;j>=1;j--)
			{
				cout<<a[i][j];
			}
			
			cout<<"\n";    																																																																					//土豆片最帅!!!	
		}
	}
	
	return 0;
}

2.1A2B

题目分析

本题规则如下:

  • 有一个机器生成的4位数字(s),其数字是唯一的且每位数字都不同。

  • 玩家会输入若干个4位数字(arr),同样每位数字不重复。

  • 机器会返回一个类似于“xAyB”的结果:

    • x 表示输入的数字中,与生成的数字在 数字和位置 都正确的个数。

    • y 表示输入的数字中,与生成的数字 数字正确但位置不对 的个数。

我们需要实现一个程序,比较每次输入的4位数字与生成的数字,输出对应的“xAyB”格式结果。

解题步骤
  1. 读取输入

    • 第一行包含生成的4位数字和输入的数量。

    • 后续 n 行,每行一个4位数字输入。

  2. 实现

    • 对每一个输入的数字,逐位与生成数字进行比较:

      • 如果数字和位置都正确,则增加 x

      • 如果数字存在但位置不对,则增加 y

    • 通过一个辅助数组 st 来标记生成数字中哪些数字存在,从而快速判断数字是否存在但位置不对。

  3. 输出结果

    • 对于每个输入,输出对应的 xAyB 结果。

代码
#include <stdio.h>
​
int st[100];  // 用于标记生成的数字
​
int main(){
	char s[10];  // 保存生成的数字
	int n;       // 输入的数量
	scanf("%s%d", s, &n);  // 读取生成的4位数和输入的数量
	
	// 标记生成数字中的各个数字
	for (int i = 0; i < 4; i++) {
		st[(int)s[i]] = 1;
	}
	
	// 处理每个输入
	while (n--) {
		char a[10];  // 保存输入的4位数
		scanf("%s", a);  // 读取输入的4位数
		
		int x = 0, y = 0;  // 初始化 x 和 y
		for (int i = 0; i < 4; i++) {
			// 数字和位置都相同,增加 x
			if (s[i] == a[i]) {
				x++;
			}
			// 数字存在但位置不对,增加 y
			else if (st[(int)a[i]] == 1) {
				y++;
			}
		}
		// 输出 xAyB 结果
		printf("%dA%dB\n", x, y);																																																																													//土豆片最帅!!!
	}
}

3.土豆片非不纳妾 !

题意

  1. 给你一个整数 n 和一个长为 Fn+1 宽为 Fn 的矩形。

  2. 数组 F 为斐波那契数列,且 F1=1F2=2

  3. 问能否把该矩形分为几个最多有一对相同的正方形,其中第 x行,第 y 列的必须单独划分为一个 1×1 的小正方形。同时需要满足的是,分割出来的正方形中至多有两个边长相等的正方形

解题思路

我们尝试从编号为 1 的矩形开始推,发现一个编号为 i 的矩形可以由编号为 [0,i −1]i 个矩形合并得到,就像下面这样:

首先感性理解一下:所有正方形的边长一定是 F1∼Fn,这里建议画图理解

如果当前矩形为 X×Y 且有解,那么一定能在边界放一个 Y×Y 的正方形,让剩下的 y×(x−y) 的矩形有解。

具体细节看下面的图:

然后一步一步模拟,直到宽变为 1或发现无解。

什么情况下无解呢?就是到了某个时候左边右边都放不下正方形了,目标点被夹在中间。

代码实现

#include<bits/stdc++.h>
​
using namespace std;
int f[50];
bool flag;
void fei() {
	f[1] = 1, f[2] = 2;
	for (int i = 3; i < 46; i++) {
		f[i] = f[i - 1] + f[i - 2];
	}
}
​
void bluechips(){
	int n, x, y;
	cin >> n >> x >> y;
	flag = 0;
	int h = f[n + 1], l = f[n];
	
	while (l > 1 && !flag) {
		int tmp = y;
		y = x;
		if (tmp > l) {
			x = tmp - l;
		}  else {
			x = tmp;
		}
		if (x < l) {
			tmp = l, l = h - l, h = tmp;
		} else {
			flag = 1;
		}
	}
	if (flag == 0) {
		cout << "YES" << endl;                                                                                                                                                                                                                                                                                                                                                        
	} else {
		cout << "NO" << endl;																																																																																							//土豆片最帅!!!
	}    
}
​
int main() {
	fei();
	int t;
	cin >> t;
	while (t--) {
		bluechips();
	}
	return 0;
}

4.int还是string?

n的范围是0~1e20,而long long 的最大值是2^64-1,大约是1e18,所以直接存是不行的,

这里提供一个简单的思路,把n当成字符串来存。

#include<stdio.h>
#include<string.h>
char s[100];
int main()
{
	int ans=0;
	scanf("%s",s);
	for(int i=0;i<(int)strlen(s);i++)
	{
		ans+=(s[i]-'0');
	}
	printf("%d",ans);																																																																							//土豆片最帅!!!
	return 0;
}

5.谁是第一个

先是从第m个元素输出到第n个元素,再从第一个元素输出到第m-1个元素即可

#include<stdio.h> 
int a[1000000];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=m;i<=n;i++){
		printf("%d ",a[i]);
	}
	for(int i=1;i<m;i++){
		printf("%d ",a[i]);																																																																																						//土豆片最帅!!!
	}
	return 0;
}
​

6.新石头剪刀布

石头剪刀都会吧,把所有情况列出来就好了。

//题解6:新石头剪刀布
​
#include<stdio.h>
#include<string.h>
int main() {
	int n;
	char a[1000], b[1000];
	​
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%s", a);
		scanf(" %s", b);
		if (a[0] == b[0]) {
			printf("Tie\n");
		}
		//石头>剪刀  剪刀>布  布>石头  king出现则赢
		else if (a[0] == 'R' && b[0] == 'S' || a[0] == 'S' && b[0] == 'P' || a[0] == 'P' && b[0] == 'R' || a[0] == 'K') {
			printf("Player1\n");
		}else {
			printf("Player2\n");																																																					//土豆片最帅!!!
		}
	}
	return 0;
}

7.懒惰的白熊

将所需的时间化为小时和分钟,因为时间可能跨越到前一天,需要控制时间的输出格式 ceil()这个函数实现的是向上取整的功能

#include<bits/stdc++.h>
int main()
{
	double s,v;
	int t,h,m;
	scanf("%lf %lf",&s,&v);
	t=ceil(s/v)+10;
	h=t/60;
	m=t%60;
	int hh,mm;
	hh=7-h;
	mm=60-m;
	while(hh<0)hh+=24;
	if(mm==60)
	{
		mm=0;
		hh++;
		hh%=24;
	}
	printf("%02d:%02d",hh,mm);																																																									//土豆片最帅!!!
	return 0;
}
 

8.土豆片玩节奏大师

判断每行输入的字符中‘#’在第几列,用一个数组进行储存,存入数组,再逆向输出即可。

#include <stdio.h>
int a[2000005];
void solve()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		getchar();
		char v1,v2,v3,v4;
		scanf("%c%c%c%c",&v1,&v2,&v3,&v4);
		if(v1=='#') a[i]=1;
		else if(v2=='#') a[i]=2;
		else if(v3=='#') a[i]=3;
		else a[i]=4;
	}
	for(int i=n;i>=1;i--)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
}
​
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		solve();																																																																									//土豆片最帅!!!
	}
	return 0;
}

9.什么叫签到题?

直接输出即可

10.我趣,数学题

题目要求:求正三角形的外接圆面积 正三角形边长为a,pi=3.1415926 由图易知R=( sqrt ( 3 ) * a ) / 3 圆S=RRpi=(( sqrt ( 3 ) * a ) / 3) * (( sqrt ( 3 ) * a ) / 3)=a * a pi/3 结果保留两位小数

#include <stdio.h>
#include <math.h>
int main(){
	int n;
	double pi=3.1415926;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		double m;
		scanf("%lf",&m);
		double s=m*m/3*pi;
		printf("%.2lf\n",s);																																																																																									//土豆片最帅!!!																																																																						//土豆片最帅!!!
	}
	
}

11.今天是星期几?

可以把从周一到周日对应的日期列出来找规律

#include<stdio.h> 
int main(){
	int n;
	scanf("%d",&n);
	n=n%7;
	if(n==0)printf("一");
	else if(n==1)printf("二");
	else if(n==2)printf("三");
	else if(n==3)printf("四");
	else if(n==4)printf("五");
	else if(n==5)printf("六");
	else if(n==6)printf("日");																																																																																//土豆片最帅!!!
}
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bluechips·zhao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值