蓝桥杯省赛真题解析1

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 75 浏览





图片

#include<bits/stdc++.h>
long long n,a,b=1,c;int main(){ scanf("%d",&n); while(n--){ printf("%d ",a); c=a+b; a=b,b=c; }}

第一题超简单



第二题

你玩过“拉灯”游戏吗?25盏灯排成一个 5×5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。
下面这种状态1011101101101111000011011在改变了最左上角的灯的状态后将变成:
0111111101101111000011011再改变它正中间的灯后状态将变成:
0111111001110011010011011给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。
输入格式第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。
以下若干行数据分为 n 组,每组数据有 5 行,每行 5 个字符。
每组数据描述了一个游戏的初始状态。
各组数据间用一个空行分隔。
输出格式一共输出 n 行数据,每行有一个小于等于 6 的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。
对于某一个游戏初始状态,若 6 步以内无法使所有灯变亮,则输出 −1
数据范围0<n≤500输入样例:30011101011100011101011100
1110111101111101111111111
0111111111111111111111111输出样例:
32-1
解法#include<bits/stdc++.h>

using namespace std;
const int N = 6;int dx[N] = {-1, 0, 1, 0, 0}, dy[N] = {0, 1, 0, -1, 0};char g[N][N], backup[N][N];

// 这个操作是把(x, y)以及上下左右的灯都变成相反的颜色void turn (int x, int y){ for (int i = 0; i < 5; i ++ ) { int a = x + dx[i], b = y + dy[i];
//如果在边界外边,直接忽略即可 if (a < 0 || a >= 5 || b < 0 || b >= 5) continue;
g[a][b] ^= 1; //异或,不同的时候就变成相反的数 }
}
int main(){ int n; scanf("%d", &n); while(n -- ) { // 按行输入,把每一行当成一个字符串 for (int i = 0; i < 5; i ++ ) cin >> g[i];
int res = 10;
// 这里我们枚举了第一行的32种按法,不用管是亮是灭,把第一行所有情况都按一遍 // 按每种情况的第一行,去遍历接下来的行 // 枚举32种第一行的按法只是可能会减少步数,如果直接从第二行开始答案一定是固定的了,找不到最优解或者可能没有解
for (int op = 0; op < 32; op ++ ) { // 我在对这种情况操作的时候,得先备用一下 // 把原始数组备份一下,然后操作g,操作完了还原,然后再操作 memcpy(backup, g, sizeof g);
int step = 0;
// 第一行的按法(在这里 1 表示按了, 0 表示不按),这里只是为了输出第一行按完之后的状态 for (int i = 0; i < 5; i ++ ) if (op >> i & 1) // 数字2 对应了 00010 表示第2个位置的按一下 // 00010 >> 1 & 1 是1 所以turn(0, 1) 就是第一行第二个位置 { // 数字3 对应了00011 表示第1 和第2个位置的按一下 step ++ ; turn (0, i);; }
// 然后通过第一行按完之后的状态,按234行 for (int i =0; i < 4; i ++ ) for (int j = 0; j < 5;j ++ ) if (g[i][j] == '0') { step ++; turn (i + 1, j); // 如果这个位置是灭的,就按下一行对应的位置 }
bool dark = false; for (int j = 0; j < 5; j ++ ) if (g[4][j] == '0') { dark = true; break;                } // 对于32种情况的这一种,如果所有的全亮就记录下步数(事实上只记录了最后一行是否dark) if (!dark) res = min(res, step);          memcpy (g, backup, sizeof g); }
if(res > 6) res = -1; cout << res << endl;
} return 0;}

第三题

图片

#include <bits/stdc++.h>using namespace std;using ll = long long;
int main(){ ll n; cin >> n; ll sum = 0, a[n], ans = 0 for(int i=0; i<n; i++) { cin >> a[i], sum += a[i]; } for(int i=0; i<n; i++) { ans += a[i] * (sum - a[i]); } cout << ans / 2 << endl; return 0;}

图片


添加 家长论坛微信 



发布于 2024-04-27 11:53

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

All Rights Reserved Powered BY WeCenter V4.1.0 © 2026 京ICP备20005761号-2