1434.蓝桥杯历届试题-回文数字 - C语言网
暴力枚举每种可能,五位枚举两对 + 单个,六位枚举三对
- #include
-
- using namespace std;
-
- int main()
- {
- int n;
- cin >> n;
- int flag = 0;
- for(int i = 1; i <= 9; i ++)
- {
- for(int j = 0; j <= 9; j ++)
- {
- for(int k = 0; k <= 9; k ++)
- {
- if(i * 2 + j * 2 + k == n)
- {
- cout << i << j << k << j << i << endl;
- flag = 1;
- }
- }
- }
- }
-
- for(int i = 1; i <= 9; i ++)
- {
- for(int j = 0; j <= 9; j ++)
- {
- for(int k = 0; k <= 9; k ++)
- {
- if(i * 2 + j * 2 + 2 * k == n)
- {
- cout << i << j << k << k << j << i << endl;
- flag = 1;
- }
- }
- }
- }
-
- if(!flag)
- cout << "-1";
- }
模拟
- #include
-
- using namespace std;
-
- const int N = 1e6 + 10;
- int a[N];
-
- int main()
- {
- int m,n,M = 500000;
- int count = 0;
- scanf("%d%d",&m,&n);
-
- for(int i = 0;i <= 500000; i ++)
- a[i] = i * 2 - 1;//只给奇数赋值
-
- int op = 3;
- int k; //记录已经不需要更改的位置
- int flag = 2;//表示的是当前的下标
-
- while(op <= n)//op为当前的被除数
- {
- flag ++;
- k = 2;
- for(int j = 2;j <= M;j++)
- { //循环整个数组
- if(j % op != 0)
- {
- a[k ++] = a[j];//刷新数组
- }
- }
- M = k;
- op = a[flag];
- }
-
- for(int i=2;i<=k;i++)
- {
- if(a[i] > m && a[i] < n)
- {
- count++;
- }
- if(a[i] >= n)
- break;
- }
- printf("%d",count);
- }
1445.蓝桥杯历届试题-最大子阵 - C语言网
Acwing上有一篇题解是用枚举边界来做的,简洁明了
而且y总也有讲解
只有范围和输入不一样
- #include
- #include
-
- using namespace std;
-
- const int N = 510;
- int g[N][N] ;
-
- int main()
- {
- int n,m;
- cin >> n >> m;
- for(int i = 1 ;i <= n; i ++)
- for(int j = 1 ;j <= m ; j ++)
- {
- cin >> g[i][j];
- //同一列的前缀和
- g[i][j] += g[i-1][j];
- }
-
- int res = -0x3f3f3f;
-
-
- //枚举上下边界
- for(int i = 1; i <= n; i ++)
- for(int j = i; j <= n ;j ++)
- {
- //枚举右边界
- int last = 0;
- for(int k = 1; k <= m; k ++)
- {
- last = max(last, 0) + g[j][k] - g[i - 1][k];
- res = max(res, last);
- }
- }
-
- cout << res;
-
- return 0;
- }
1462.蓝桥杯2013年第四届真题-格子刷油漆 - C语言网
dp

- #include
-
- using namespace std;
-
- typedef long long ll;
- const ll mod = 1000000007;
- int n;
- ll a[1000];//表示从起点出发遍历全部格子的方案数
- ll b[1000];//表示从起点出发遍历全部格子且终点与起点同列
- ll sum;
- int main()
- {
- cin >> n;
- a[1] = 1;
- b[1] = 1;
- a[2] = 6;
- b[2] = 2;
- for (int i = 3; i <= n; i++)
- {
- b[i] = 2 * b[i - 1] % mod;
- a[i] = ((2 * b[i - 1]) % mod + (4 * a[i - 2]) % mod + (2 * a[i - 1]) % mod) % mod;
- }
- for (int i = 2; i < n; i++)
- {
- sum += ((4 * b[n - i + 1] % mod * a[i - 1] % mod) % mod + (4 * b[i] % mod * a[n - i] % mod) % mod) % mod;
- }
- sum = (sum + ((a[n] * 4) % mod)) % mod;
- cout << sum;
- return 0;
- }
1459.蓝桥杯2013年第四届真题-高僧斗法 - C语言网
将原问题转化为台阶Nim游戏,判断是否必胜,如果必胜,找到必胜点(依次枚举每个位置,枚举移动位置)
- #include
-
- using namespace std;
-
- const int N = 110;
-
- int main()
- {
- int a[N],b[N];
- int cnt = 0;//小和尚个数
- int sum = 0;
- while(cin >> a[cnt])
- cnt ++;
- for(int i = 1; i < cnt; i ++)//转化成Nim游戏
- b[i - 1] = a[i] - a[i-1] - 1;
-
- for(int i = 0; i < cnt - 1; i += 2)//必胜判断
- sum ^= b[i];
- if(sum == 0)//必败
- cout << -1 << endl;
- else
- {
- for(int i = 0; i < cnt - 1; i ++)//枚举移动第i堆
- for(int j = 1; a[i] + j < a[i + 1]; j ++)//枚举可以移动的个数
- {
- b[i] -= j;//拿走 j个
- if(i != 0)
- b[i - 1] += j;//它的后一堆b[i]取走了j个,前一堆 b[i-1] 要增加j个
- sum = 0;
- for(int k = 0; k < cnt - 1; k += 2)
- sum ^= b[k];
- if(sum==0)
- {
- cout << a[i] << " " << a[i] + j << endl;
- break;
- }
- b[i] += j;
- if(i != 0)
- b[i - 1] -= j;
- }
- }
- return 0;
- }
1426.蓝桥杯历届试题-九宫重排 - C语言网
Acwing上八数码同一类型,用BFS即可
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- int bfs(string state)
- {
- queue
q; - unordered_map
int> d; - q.push(state);
- d[state]=0;
- int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
- string end;
- cin >> end;
- while(q.size())
- {
- auto t = q.front();
- q.pop();
- if(t == end)
- return d[t];
- int distance=d[t];
- int k=t.find('.');
- int x=k/3,y=k%3;
- for(int i=0;i<4;i++)
- {
- int a=x+dx[i],b=y+dy[i];
- if(a>=0&&a<3&&b>=0&&b<3)
- {
- swap(t[a*3+b],t[k]);
- if(!d.count(t))
- {
- d[t]=distance+1;
- q.push(t);
- }
- swap(t[a*3+b],t[k]);
- }
- }
- }
- return -1;
- }
- int main()
- {
- string state;
- cin >> state;
- cout<<bfs(state)<
- }