【2019第十届蓝桥杯省赛C/C++B组题解】(非官方题解)

版权声明:欢迎学习我的博客,希望ACM的发展越来越好~ https://blog.csdn.net/qq_41289920/article/details/88898885

A。 

数数题。

答案:490


B。

26进制模拟。

答案:BYQ


C。

 类似fib数列求值,递推一下就好。

答案:4659


D。

 注意两个坑点,一个是正整数,所以枚举要从1开始。第二个坑点是互不相同的,为了达到这一点我们可以考虑三层循环枚举的时候令i<j<k、

答案:40785


E。

 这题注意dfs会炸(据说),但是直接bfs是O(n*m)的复杂度跑的飞快秒出结果。至于字典序,直接按照那个方向搜索,然后直接回溯的时候输出答案就可以了。当然也可以把路径以字符串的形式每次都存到一个对应的结构体里,到时候直接输出用可以。

答案:DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR


F。

 

水题,直接暴力。


G。 

水题,直接读入到数组中然后按2的幂次遍历数组就可以了,学过数据结构的话这题会好做很多。


H。

水题,按照差去求gcd就可以了。最后对于一个数的情况,特判一下。


 

注意这题后缀表达式不能直接排个序然后贪心,因为后缀表达式相当于是可以加括号改变优先级的正常表达式。正解是先求和,然后看可以将多少个减号放到括号里变成一个加号,其实就是贪心减号就可以了。

参考代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int n,m;
int a[MAX];
int main() 
{
	cin>>n>>m;
	int all = n + m + 1;
	ll sum = 0;
	for(int i = 1; i<=all; i++) scanf("%d",a+i),sum += a[i];
	sort(a + 1,a + all + 1);
	if(a[1] >= 0 && m>0) sum -= 2 * a[1];//拿出一个当负数,其他全可以为正数。(也就是在这个负数前面加括号,然后不用管正负号的个数,这一个括号定好之后,正号放在括号外面,负号放在括号里面就可以了。
	if(a[1] < 0) {
		for(int i = 0; i<=all ; i++) {
			if(a[i] > 0 || m == 0) break;
			sum += (-a[i]) * 2;
			m--;
		}
	}
	printf("%lld\n",sum);
	return 0;
}

I。 

这里不得不说一句,bzoj原题。。。 其实是有一道类似但是不完全相同的题。

题解再说吧emmm暂无正解。

猜你喜欢

转载自blog.csdn.net/qq_41289920/article/details/88898885