蓝桥杯算法算法

2014年第五届蓝桥杯C/C++B组省赛

2019-03-03  本文已影响2人  简言之_

一、啤酒和饮料

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。

我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

注意:答案是一个整数。请通过浏览器提交答案。

不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。

分析:此题可用循环暴力求解出结果。
数值先都扩大十倍,方便计算。
设啤酒i,饮料j,则根据上述计算可知,i<j , i * 23 + j * 19 == 823

代码:
#include <iostream>
 using namespace std;
  int main(){
    for(int i = 0; i < 50; i++){
        for(int j = 1; j < 50; j++){
            if(i * 23 + j * 19 == 823&&i<j){
                cout<<i<<" "<<j<<endl;
            }
        }
    }
    return 0;
}

答案:11

二、切面条

一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

分析:观察得到的面条数,发现规律,计算出答案

对折次数     面条数              规律
  0------------2--------------1+2的0次方
  1------------3--------------1+2的1次方
  2------------5--------------1+2的2次方
  3------------9--------------1+2的3次方
  4------------17-------------1+2的4次方
  ···
  10------------?-------------1+2的10次方

答案:1025

三、李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

分析:运用DFS算法,当遇见店时酒乘一倍,遇见花时酒减1,直到店和花都为0时,输出酒的数值。

#include <iostream>
using namespace std;
int ans=0;
void dfs(int dian,int hua,int jiu){
    if(dian==0 && hua==0 && jiu==1){//出口 
        ans++;
    } 
    //枚举可能情况 
    if(dian>0) dfs(dian-1,hua,jiu*2);
    if(hua>0)  dfs(dian,hua-1,jiu-1);
}

int main(){
    int n;    
    dfs(5,9,2);
    cout<<ans;
     return 0;
}

答案:14

六、奇怪的分式

上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

1/4 乘以 8/5

小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

请写出所有不同算式的个数(包括题中举例的)。

显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

image
分析:暴力破解法求出答案。
#include <iostream>
using namespace std;

int main(){
    int ans=0;
    for(int a=1;a<=9;a++){
        for(int b=1;b<=9;b++){
            for(int c=1;c<=9;c++){
                for(int d=1;d<=9;d++){
                    if(a!=b && c!=d){
                        if(a*c*(b*10+d) == b*d*(a*10+c))
                            {
                                ans++;
                                printf("%d/%d * %d/%d= %d/%d\n",a,b,c,d,a*10+c,b*10+d);
                            }
                    }
            
                }
            }
        }
    }
    printf("ans=%d\n",ans);
    return 0;
}
}

答案:14

上一篇下一篇

猜你喜欢

热点阅读