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";
}
1441.蓝桥杯2013年第四届真题-幸运数 - C语言网
模拟
#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总也有讲解
AcWing 126. 最大的和 - AcWing
只有范围和输入不一样
#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 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<