2019蓝桥杯国赛C++B组程序题部分

最优包含

AC2553
类似编辑距离DP的题目

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
char a[1005],b[1005];
int f[1005][1005];//f(i,j) a的前 i 个包含 b的前  j 个 的最小操作数 
int main(){
	memset(f,0x3f,sizeof f);
	scanf("%s",a+1);
	scanf("%s",b+1);
	int lena=strlen(a+1);
	int lenb=strlen(b+1);
	f[0][0]=0; 
	for(int i=1;i<=lena;i++){
		f[i][0]=0;
		for(int j=1;j<=lenb;j++){
			f[i][j]=f[i-1][j];
			//前 i-1个就可以包含b的前 j 个
			//所以前 i个 可以直接等于i-1的操作数(j相同条件) 
			if(a[i]==b[j]){
				f[i][j]=f[i-1][j-1];
				//根据我们的表达式
				// a的前 i 个包含 b的前  j 个 的最小操作数 
				//假如 a=abcd,b=adc
				//f(2,2)很明显是 2
				//f(3,3)由于a[3]=b[3]所以根本没影响等于f(2,2)=2 
			}
			f[i][j]=min(f[i][j],f[i-1][j-1]+1);
			//进行一次操作可以理解成让有一个没满足条件的字符串满足条件
			// //假如 a=abcd,b=adc
			//f(1,1)很明显是 1 
			//f(2,2)时,a[2]!=b[2],就直接进行一次操作,操作具体干什么不重要
			//关键是结果为操作数加一,同时满足匹配  f(2,2)=f(1,1)+1;
		}
	} 
	cout<<f[lena][lenb];
  return 0;
}




//  freopen("testdata.in", "r", stdin);

排列数

AC2554
真的不会做。。 网上搜索也没有搜索出答案。

解密游戏

AC2555
无论如何操作,每个灯管只能和横向位置 mod4 与其相等的位置上的灯管交换
按照横向位置 mod4 分组,每组 6 个灯管
当且仅当每组有 1 个黄的,2 个红的,3个绿的时可以达成目标

#include<cstdio>
#include<cstring>

const int N = 110;

char s[3][N];

int main()
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        for(int i = 0; i < 3; i ++)  scanf("%s", s[i]);
        bool flag = true;
        for(int k = 0; k < 4; k ++)
        {
            int y = 0, r = 0, g = 0;
            for(int i = 0; i < 3; i ++)
                for(int j = k; s[i][j]; j += 4)
                    if(s[i][j] == 'Y')  y ++;
                    else if(s[i][j] == 'R')  r ++;
                    else  g ++;
            if(!(y == 1 and r == 2 and g == 3))  flag = false;
        }
        if(flag)  puts("YES");
        else  puts("NO");
    }
    return 0;
}

倒二题算法是数状数组和整体二分,但是整体二分没学不会。
最后一题建议是能骗多少分是多少分。

posted @ 2020-11-11 21:26  一个经常掉线的人  阅读(200)  评论(0)    收藏  举报