2015第六届蓝桥杯C/C++ A组题解

第一题 方程整数解

-30 我做完题目去网上对答案 好多人都没有考虑到整数包括负数

第二题

2017-08-05

第三题

奇妙的数字

小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?

请填写该数字,不要填写任何多余的内容。

69

第四题

九数组分数

1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

#include <stdio.h>

void test(int x[])
{
    int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
    int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
    
    if(a*3==b) printf("%d / %d\n", a, b);
}

void f(int x[], int k)
{
    int i,t;
    if(k>=9){
        test(x);
        return;
    }
    
    for(i=k; i<9; i++){
        {t=x[k]; x[k]=x[i]; x[i]=t;}
        f(x,k+1);
        t=x[k]; x[k]=x[i]; x[i]=t; // 填空处
    }
}
    
int main()
{
    int x[] = {1,2,3,4,5,6,7,8,9};
    f(x,0);    
    return 0;
}


注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

第五题

九数组分数

1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

#include <stdio.h>

void test(int x[])
{
    int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
    int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
    
    if(a*3==b) printf("%d / %d\n", a, b);
}

void f(int x[], int k)
{
    int i,t;
    if(k>=9){
        test(x);
        return;
    }
    
    for(i=k; i<9; i++){
        {t=x[k]; x[k]=x[i]; x[i]=t;}
        f(x,k+1);
        t=x[k]; x[k]=x[i]; x[i]=t; // 填空处
    }
}
    
int main()
{
    int x[] = {1,2,3,4,5,6,7,8,9};
    f(x,0);    
    return 0;
}


注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

第六题

牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。

3598180

#include<iostream>
using namespace std;

int cnt=0;

void dfs(int type,int sum)//牌的种类, 取牌总数
{
    if(sum==13)
    {
        cnt++;
        return;
    }
    if(type==14 || sum>13)
        return;
    for(int i=0;i<5;i++)
    {
        dfs(type+1,sum+i);
    }
    return;
}

int main()
{
    dfs(1,0);
    cout<<cnt<<endl;
    return 0;
}

这是第一次写的错误的,不知道错在哪里了,代码放出来希望大家能帮我看下哪里错啦。

/*
 这道题我的做法一开始是错的 但是我不知道错在哪里
 我的思路是每种牌只能取0,1,2,3,4张
 所以设取了一张牌的有A个,取了两张牌的有B个,取了三张牌的有C个,取了四张牌的有D个
 则A+2B+3C+4D=13时,
 用排列组合去取各种可能。
 比如A=0,B=2,C=3,D=0的时候,就是13种牌取两种,每种取两张牌,取三种牌每种取三张。
 但是得出结论是3597966 不知道为什么不对
 */
#include<iostream>
using namespace std;

int combine(int a,int b)
{//排列组合 c上a下b
    int cnt1=1;
    int cnt2=1;
    for(int i=0;i<a;i++)
    {
        cnt1*=(b-i);
        cnt2*=(i+1);
    }
    return cnt1/cnt2;
}
int main()
{
    int a,b,c,d;
    int cnt=0;
    for(a=0;a<=13;a++)
    {
        for(b=0;a+2*b<=13&&b<=6;b++)
        {
            for(c=0;a+2*b+3*c<=13 && c<=4;c++)
            {
                for(d=0;a+2*b+3*c+4*d<=13 && d<=3;d++)
                {
                    if(a+2*b+3*c+4*d==13)
                    {
                        cnt+=combine(a,13)*combine(b,13-a)*combine(c,13-a-b)*combine(d,13-a-b-c);
                    }
                }
            }
        }
    }
    cout<<cnt<<endl;
    return 0;
}

第七题

手链样式

小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?

请你提交该整数。不要填写任何多余的内容或说明性的文字。

仿佛回到了学离散数学的时候~ 

这部分的代码要写一下

1170

第八题

饮料换购

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。

输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
输出:一个整数,表示实际得到的饮料数

例如:
用户输入:
100
程序应该输出:
149

用户输入:
101
程序应该输出:
151

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    
    int cnt=0;
    cnt=n;
    while(n/3!=0)
    {
        
        int a=n/3;
        cnt+=a;
        n=n-a*3+a;
    }
    cout<<cnt<<endl;
}

第九题

垒骰子

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。

不要小看了 atm 的骰子数量哦~

「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。

「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。

「样例输入」
2 1
1 2

「样例输出」
544

「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36

#include<iostream>
using namespace std;

bool face[7][7]={false};//true表示不能两个面接触
int opposite[7]={0,4,5,6,1,2,3};//对立面
long long int cnt=0;
long long int themod=1000000007;

long long int dfs(int n,int num)
{
    long long int cnthelp=0;
    if(n==0)
        return 1;
    if(num==-1)//放置第一个骰子
    {
        for(int i=1;i<7;i++)
        {
            cnt=(cnt+4*dfs(n-1,i)%themod)%themod;
        }
    }
    else
    {
        for(int i=1;i<7;i++)
        {
            if(face[opposite[num]][i]==false)
            {//确定上下面之后 前后左右有四种朝向
                cnthelp=(cnthelp+4*dfs(n-1,i)%themod)%themod;
            }
        }
       
    }
    return cnthelp;
}

int main()
{
    int n,m;
    cin>>n>>m;
    
    int a,b;
    for(int i=0;i<m;i++)
    {
        cin>>a>>b;
        face[a][b]=true;
        face[b][a]=true;
    }
    
    dfs(n,-1);
    cout<<cnt<<endl;
    
    return 0;
}

第十题

emmm我觉得很麻烦,有点难。

猜你喜欢

转载自blog.csdn.net/weixin_41242380/article/details/88525849
今日推荐