蓝桥杯练习

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

蓝桥杯练习_第1张图片

 

#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<

你可能感兴趣的:(蓝桥杯,C语言网)