一、方格分割
题目链接:方格分割 - 蓝桥云课 (lanqiao.cn)
题目要求:
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
解题思路:
dfs深搜加记忆化搜索,然后结果除4就行。
#include<bits/stdc++.h> using namespace std; int dx[] = {1,0,0,-1}; int dy[] = {0,1,-1,0}; bool vis[10][10]; int res; void dfs(int x,int y) { if(x==0||y==0||x==6||y==6) { res++; return ; } for(int i=0;i<4;i++) { x += dx[i]; y += dy[i]; if(!vis[x][y]) { vis[x][y] = true; vis[6-x][6-y] = true; dfs(x,y); vis[x][y] = false; vis[6-x][6-y] = false; } x -= dx[i]; y -= dy[i]; } } int main() { vis[3][3] = true; dfs(3,3); cout<<res/4; return 0; }
二、数的幂次
题目链接:数的幂次 - 蓝桥云课 (lanqiao.cn)
题目要求:
给定三个正整数 N,M,P,求 N^Mmod p。
解题思路:
快速幂
#include<bits/stdc++.h> #define ll long long using namespace std; ll pow_mod(ll x , ll n , ll mod) { ll res = 1; while(n) { if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } int main() { int T = 1; cin >> T; while(T --) { ll n , m , p; cin >> n >> m >> p; cout << pow_mod(n , m , p) << '\n'; } return 0; }
三、取球游戏
题目链接:取球游戏 - 蓝桥云课 (lanqiao.cn)
题目要求:
今盒子里有 n 个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个。轮到某一方取球时不能弃权!A 先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A 是否能赢?
解题思路:
简单博弈论,有规律的 是1357a必输 反着来让1357加i 把i设置一个很高的值 如果当前i为0 就把当前的i+1357设置为1。
#include<bits/stdc++.h> using namespace std; int a[101],b[10001]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } for(int i=1;i<10001;i++) { if(b[i]==0) { b[i+1]=1; b[i+3]=1; b[i+7]=1; b[i+8]=1; } } for(int i=0;i<n;i++) { cout<<b[a[i]]<<endl; } return 0; }
四、错误票据
题目链接:错误票据 - 蓝桥云课 (lanqiao.cn)
题目要求:
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。
因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。
你的任务是通过编程,找出断号的 ID 和重号的 ID 。
假设断号不可能发生在最大和最小号。
解题思路:
直接暴力就ok
#include<bits/stdc++.h> using namespace std; const int N = 1e4+10; int a[N]; int main() { int n; cin >> n; int cnt = 0; while(scanf("%d",&a[cnt++]) != EOF); sort(a, a+cnt); int ans1, ans2; for(int i = 1; i < cnt; i++) { if(a[i] - a[i-1] > 1) { ans1 = a[i-1] + 1; } if(a[i] == a[i-1]) { ans2 = a[i]; } } cout << ans1 << ' ' << ans2; return 0; }