也是学了一段时间了,出了一场很简单的周赛题给新生,可以看出来新生之间的差距已经拉开了,感觉这一次的周赛新生最少最少写到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”格式结果。
解题步骤
-
读取输入:
-
第一行包含生成的4位数字和输入的数量。
-
后续
n
行,每行一个4位数字输入。
-
-
实现:
-
对每一个输入的数字,逐位与生成数字进行比较:
-
如果数字和位置都正确,则增加
x
。 -
如果数字存在但位置不对,则增加
y
。
-
-
通过一个辅助数组
st
来标记生成数字中哪些数字存在,从而快速判断数字是否存在但位置不对。
-
-
输出结果:
-
对于每个输入,输出对应的
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.土豆片非不纳妾 !
题意
-
给你一个整数 n 和一个长为 Fn+1 宽为 Fn 的矩形。
-
数组 F 为斐波那契数列,且 F1=1,F2=2。
-
问能否把该矩形分为几个最多有一对相同的正方形,其中第 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("日"); //土豆片最帅!!!
}