赞
踩
哈喽啊,好久不见朋友们,昨天蓝桥杯刚过去,趁着我题目还记着,来给你们讲一下
还是那句话,点赞关注加复制代码 \doge.
题目描述我只讲个大概!!!
给你两个数a,b要求输出两数中较大的一个
没错这是一道非常弱智的题目,我当时看到的时候给我震惊住了(第一次参加真没想到原来真的那么简单),这里给大家用多种方法解答
库中自带函数版
- #include <iostream>
- #include <cmath>
- using namespace std;
- int main(){
- int a,b;
- cin >> a >> b;
- cout << max(a, b);
- return 0;
- }
自己写函数版
- #include <iostream>
- using namespace std;
- int ma(int a, int b){
- if(a > b){
- return a;
- }
- return b;
- }
- int main(){
- int a,b;
- cin >> a >> b;
- cout << ma(a, b);
- return 0;
- }
if判断版
- #include <iostream>
- using namespace std;
- int main(){
- int a,b;
- cin >> a >> b;
- if(a > b){
- cout << a;
- }else{
- cout << b;
- }
- return 0;
- }
呦西家人们,有一位热心的大佬给我提供了题目,所以我来补上这道题了
据说这道题是字符串逆序输出
虽说感觉这么说有点不太好,但是的确感觉很简单,你可以采用字符串输入,也可以采用字符数组输入(反正输进去就完事了,你就是用int存问题都不大),然后倒着输出就好
- #include <iostream>
- #include <math.h>
- using namespace std;
- int main(){
- string s;
- cin >> s;
- for(int i = s.size() - 1; i >= 0; i--){
- cout << s[i];
- }
- return 0;
- }
给你10个数和一个数n,求10个数中相加小于等于n且最接近n的两数之和,如果不存在这样两个数就输出-1
这题虽然没有第一题那么弱智,但也是比较简单的
直接双重for循环
- #include <iostream>
- using namespace std;
- int a[11];
- int main(){
- int n;
- for(int i = 1; i <= 10; i++){
- cin >> a[i];
- }
- cin >> n;
- int ans = -1;
- for(int i = 1; i < 10; i++){//这里一定要小于,不然后面会非法访问
- for(int j = i + 1; j <= 10; j++){//i+1防止重复计算
- int res = a[i] + a[j];//也不知道为什么这里一定要设一个变量记录,不然后面会有两个点不过
- if(res <= n && res > ans){
- ans = res;
- }
- if(ans == n){//优化,减少不必要的循环(虽说不优化也不会超时,但是优化是个好习惯
- cout << n;
- return 0;
- }
- }
- }
- cout << ans << endl;
- return 0;
- }
给你n(n <= 10)个数,要求将这两个数分成两组后,每组数的和的差值尽可能的小
输出每组数的和,若不相同,大的在前,中间用空格隔开
说实话,我当时看到这道题还懵逼了一下,怎么难度突然这么大,然后一看数据“昂 直接暴力”
所以这道题的方法当然就是递归
- #include <bits/stdc++.h>
- using namespace std;
- int n, a[12],r1 = (int)1e9,r2;//r1 r2最终答案,初始化使差值最大
-
- void f(int st, int r3, int r4){//st已分配数量,r3 r4临时答案
- if(st == n){//已分配完
- if(abs(r3 - r4) < abs(r1 - r2)){//若有更优解则更新
- r1 = r3;
- r2 = r4;
-
- }
- return;//结束递归,防止陷入死循环
- }
- f(st + 1,r3 + a[st], r4);
- f(st + 1,r3, r4 + a[st]);
- }
- int main(){
- cin >> n;
-
- for(int i = 0; i < n; i++){
- cin >> a[i];
- }
-
- f(0,0,0);
- if(r1 > r2){
- cout << r1 << " " << r2;
- }else{
- cout << r2 << " " << r1;
- }
- return 0;
- }
这里其实很容易看出来可以做剪枝优化什么的,这个我就懒得讲了
给你n(n <= 10)个男生和女生的身高,两两一组配对,要求男生升高不比女生矮,不符合要求的对数不能超过k,求有几种配对方案
好吧这道题我第一反应就是回溯,然后就感觉会超时,接着一看数据范围,好吧根本不会
所以这题也还是暴力
- #include <bits/stdc++.h>
- using namespace std;
- int a[11], b [11];//a男生,b女生
- bool v[11];//标记是否已经配对过
- int n, k;
- int ans =0;//最终方案数
- void f(int st, int x){//st已配对数量,x不符合要求对数
- if(x > k){//不符合要求对数超限
- return;
- }
- if(st == n){//全部都已配对
- ans++;
- return;
- }
- for(int i = 0;i < n; i++){//一个一个配过去
- if(!v[i]){//如果没有配对过
- if(a[st] < b[i]){//不符合要求
-
- v[i] = 1;//标记已配对
- f(st+1,x + 1);
- v[i] = 0;//回溯取消标记
- }else{//符合要求
- v[i] = 1;
- f(st + 1,x);
- v[i] = 0;
- }
- }
-
- }
- }
- int main(){
-
- cin >> n >> k;
- for(int i = 0; i < n; i++){
- cin >> a[i];
- }
- for(int i = 0; i < n; i++){
- cin >> b[i];
- }
- f(0,0);
- cout << ans << endl;
- return 0;
- }
说实话我感觉蓝桥杯的选择题考的是真的范围很广(但编程大题也是真的弱智),五道大题三道暴力,真的没啥技术含量
感觉这个比赛就印证了一句话
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。