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;
}
倒二题算法是数状数组和整体二分,但是整体二分没学不会。
最后一题建议是能骗多少分是多少分。

浙公网安备 33010602011771号