2020年第十一届C/C++ A组第一场蓝桥杯省赛

Pro

这套题为嘛这么多dp!!!把我杀了吧

虽然有的dp比较简单吧 虽然有某个题可以用其他做法躲避dp吧

但是我dp巨菜的事实又暴露了呀!

Sol

跑步训练

简单的模拟题,跟着题目来就好

还是带上代码吧

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define L 100005
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define _ceil(_,__) (_+(__-1))/__
#define debug(_) cout<<endl<<"d::"<<_<<endl<<endl
#define type(_) typeid(_).name()
inline LL read() {
    
    
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
    
     if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

LL x = 10000 , m , flag; 

int main() {
    
    
	//freopen("data.txt","r",stdin);
	flag = 1;
	while(1) {
    
    
		if(x==0) {
    
    
			cout<<m;
			return 0;
		}
		if(flag==1) {
    
    
			if(x<600) {
    
    
				m+=x/10;
				flag=2;
				x = 0;
				continue;
			} else {
    
    
				m+=60;
				flag=2;
				x-=600;
				continue;
			}
		} else {
    
    
			x+=300;
			m+=60;
			flag=1;
		}
	}
	return 0;
}


合并检测

数学题

题解传送门

分配口罩

不用dp 直接深搜就可

代码如下

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define L 100005
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define _ceil(_,__) (_+(__-1))/__
#define debug(_) cout<<endl<<"d::"<<_<<endl<<endl
#define type(_) typeid(_).name()
inline LL read() {
    
    
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
    
     if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

int ans = INF , num[16]={
    
    0, 9090400, 8499400, 5926800, 8547000, 4958200,
                4422600, 5751200, 4175600, 6309600, 5865200, 6604400, 4635000,
                10663400, 8087200, 4554000};

void dfs(int x , int d1 , int d2) {
    
    
	if(x>15) {
    
    
		ans = min(ans , abs(d1-d2));
		return ;
	}
	dfs(x+1,d1+num[x],d2);
	dfs(x+1,d1,d2+num[x]);
}

int main() {
    
    
//	freopen("data.txt","r",stdin);
	dfs(0,0,0);
	cout<<ans;
	return 0;
}

矩阵

好像是个dp题 / 卡特兰数(数论题)

反正是一个不会的题

卡特兰数题解

dp题解

完美平方数

这题实在是暴力不出来啊啊啊啊

解码

字符串模拟水题

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define L 100005
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define _ceil(_,__) (_+(__-1))/__
#define debug(_) cout<<endl<<"d::"<<_<<endl<<endl
#define type(_) typeid(_).name()
inline LL read() {
    
    
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
    
     if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

LL len;
string s;

int main() {
    
    
//	freopen("data.txt","r",stdin);
	cin>>s;
	len = s.length();
	Fo(i,0,len-1) {
    
    
		if(s[i+1]>='1'&&s[i+1]<='9') {
    
    
			Fo(j,1,s[i+1]-'0')
				cout<<s[i];
			i++;
			continue;
		}	
		cout<<s[i];
	} 
	return 0;
}

走方格

第一遍写的bfs 发现会T 后来看正解:dp!!!(杀了我吧

bfs代码(写的时候不要写vis数组 要不然答案不对哦)

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define L 100005
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define _ceil(_,__) (_+(__-1))/__
#define debug(_) cout<<endl<<"d::"<<_<<endl<<endl
#define type(_) typeid(_).name()
inline LL read() {
    
    
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
    
     if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

struct Node {
    
    
	int x , y;
};
queue<Node>q;
LL n , m , dx[2]={
    
    1,0} , dy[2]={
    
    0,1} , ans;


void bfs(int sx , int sy) {
    
    
	q.push({
    
    sx,sy});
	while(!q.empty()) {
    
    
		Node u = q.front();
		q.pop();
		if(u.x==n&&u.y==m) {
    
    
			ans++;
			continue;
		}
		Fo(i,0,1) {
    
    
			int tx , ty;
			tx = u.x+dx[i];
			ty = u.y+dy[i];
			if(tx<=0||tx>n||ty<=0||ty>m||(tx%2==0&&ty%2==0))
				continue;
			q.push({
    
    tx,ty});
		}
	}
}

int main() {
    
    
//	freopen("data.txt","r",stdin);
	scanf("%lld%lld",&n,&m);
	if(n%2==0&&m%2==0) {
    
    
		printf("0");
		return 0;
	}
	bfs(1 , 1);
	printf("%lld",ans);
	return 0;
}

简单dp

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define L 100005
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define _ceil(_,__) (_+(__-1))/__
#define debug(_) cout<<endl<<"d::"<<_<<endl<<endl
#define type(_) typeid(_).name()
inline LL read() {
    
    
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
    
     if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

LL n , m , f[35][35];

int main() {
    
    
//	freopen("data.txt","r",stdin);
	scanf("%lld%lld",&n,&m);
	if(n%2==0&&m%2==0)
		printf("0");
	else {
    
    
		f[1][1] = 1;
		Fo(i,1,n)
			Fo(j,1,m) {
    
    
				if(i==1&&j==1) continue;
				if(i%2==1||j%2==1)
					f[i][j] = f[i-1][j] + f[i][j-1];				
			}
		printf("%lld",f[n][m]);
	}
	return 0;
}

整数小拼接

真的不会 待更

一篇看不懂的题解

超级胶水

类似于……石子合并吧 感觉是个区间dp(反正我不会

网络分析

带权并查集

忘记了 还是待更。。。

Sum

这套题的确做的不太好

可能心态或者的确好多知识盲点

啊啊啊 要好好复习了呀

猜你喜欢

转载自blog.csdn.net/cls1277/article/details/115214479