P10898 [蓝桥杯 2024 省 C] 拼正方形
题目描述
小蓝正在玩拼图游戏,他有 7385137888721 个 2×2的方块和 10470245个 1×1 的方块,他需要从中挑出一些来拼出一个正方形,比如用 3 个 2×2 和 4 个 1×1 的方块可以拼出一个 4×4 的正方形,用 9个 2×2 的方块可以拼出一个 6×6 的正方形,请问小蓝能拼成的最大的正方形的边长为多少。
输入格式
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
输出格式
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
输入输出样例
无
思路
这题考察的其实是数学的等差数列。
代码
#include<stdio.h>
int main(){
printf("5435122\n");
return 0;
}
P5730 【深基5.例10】显示屏
题目描述
液晶屏上,每个阿拉伯数字都是可以显示成 3×5 的点阵的(其中 X
表示亮点,.
表示暗点)。现在给出数字位数(不超过 100)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。
输入格式
第一行输入一个正整数 n,表示数字的位数。
第二行输入一个长度为 n 的自然数。
输出格式
输出五行,表示显示屏上的数字。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
char s[110];
char a[10][5][3] =
{
{//0
'X','X','X',
'X','.','X',
'X','.','X',
'X','.','X',
'X','X','X',
},
{//1
'.','.','X',
'.','.','X',
'.','.','X',
'.','.','X',
'.','.','X',
},
{//2
'X','X','X',
'.','.','X',
'X','X','X',
'X','.','.',
'X','X','X',
},
{//3
'X','X','X',
'.','.','X',
'X','X','X',
'.','.','X',
'X','X','X',
},
{//4
'X','.','X',
'X','.','X',
'X','X','X',
'.','.','X',
'.','.','X',
},
{//5
'X','X','X',
'X','.','.',
'X','X','X',
'.','.','X',
'X','X','X',
},
{//6
'X','X','X',
'X','.','.',
'X','X','X',
'X','.','X',
'X','X','X',
},
{//7
'X','X','X',
'.','.','X',
'.','.','X',
'.','.','X',
'.','.','X',
},
{//8
'X','X','X',
'X','.','X',
'X','X','X',
'X','.','X',
'X','X','X',
},
{//9
'X','X','X',
'X','.','X',
'X','X','X',
'.','.','X',
'X','X','X',
}
};
int main() {
cin >> n; // 读取数字字符串的长度
for (int i = 0; i < n; i++) {
cin >> s[i]; // 读取数字字符串中的每个字符
}
// 遍历图形的每一行
for (int i = 0; i < 5; i++) {
// 遍历数字字符串中的每个数字
for (int j = 0; j < n; j++) {
// 遍历当前数字的图形中的每一列
for (int k = 0; k < 3; k++) {
cout << a[s[j] - '0'][i][k]; // 打印当前图形位置的字符
}
if (j != n - 1) cout << '.'; // 如果不是最后一个数字,则打印分隔符'.'
}
cout << endl; // 换行,开始打印下一行图形
}
return 0;
}
P2141 [NOIP2014 普及组] 珠心算测验
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
输入格式
共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。
第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
代码
#include<stdio.h>
#include<string.h>
// 定义全局变量
int n; // 数组a的长度
int a[300]; // 存储输入的数组元素
int b[30000] = { 0 }; // 用于标记数组a中每个元素是否出现过
int c[30000] = { 0 }; // 用于记录每个和出现的次数
// 定义一个简单的max函数,返回两个整数中的较大值
int max(int x, int y) {
if (x > y) return x;
return y;
}
int main() {
scanf("%d", &n); // 读取数组a的长度
memset(a, 0, sizeof(a)); // 实际上这里对a的memset是多余的,因为后续会重新读取值
memset(b, 0, sizeof(b)); // 初始化b数组,将所有元素设为0
memset(c, 0, sizeof(c)); // 初始化c数组,将所有元素设为0
// 读取数组a的元素,并在b数组中标记这些元素出现过
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
b[a[i]] = 1;
}
int maxx = -1; // 用于记录最大的两数之和
// 遍历数组a,计算所有元素对的和,并更新c数组和maxx
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
c[a[i] + a[j]]++; // 记录每个和出现的次数
maxx = max(maxx, a[i] + a[j]); // 更新最大的和
}
}
int count = 0; // 用于记录符合条件的和的数量
// 遍历从0到maxx的所有和,检查是否满足条件(在原数组中出现过且只被计算过一次)
for (int i = 0; i <= maxx; i++) {
if (b[i] == 1 && c[i] > 0) count++; // 如果这个和在原数组中存在且至少被计算过一次(实际上这里c[i] > 0是多余的,因为只要b[i]为1,c[i]必然大于0)
}
printf("%d\n", count); // 输出结果
return 0;
}