蓝桥杯省赛真题解析1

#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输入样例:3001110101110001110101110011101111011111011111111110111111111111111111111111输出样例: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 = 0for(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;}

添加 家长论坛微信

全部 0条评论