2016第七届蓝桥杯大赛C组省赛

第一题
报纸页数

X星球日报和我们地球的城市早报是一样的,
都是一些单独的纸张叠在一起而已。每张纸印有4版。

比如,某张报纸包含的4页是:5,6,11,12,
可以确定它应该是最上边的第2张报纸。

我们在太空中捡到了一张X星球的报纸,4个页码分别是:
1125,1126,1727,1728

请你计算这份报纸一共多少页(也就是最大页码,并不是用了几张纸哦)?

请填写表示总页数的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

答案:

题目还是没看懂

第二题
煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
….
如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。

//题目不难,用一个函数计算第几层有多少个,然后加到总和
/*for(int i=1; i<=100; i++) {
        sum += fun(i);
    }*/
//100层煤球一共有多少个
//100层煤球一共有多少个
//100层煤球一共有多少个
//不要再粗心写5050了,勿忘勿忘勿忘
#include<stdio.h>

int fun(int n) {

    int sum = 0;

    for(int i=1; i<=n; i++) {
        sum += i;
    }

    return sum;
}

int main() {

    int sum = 0;

    for(int i=1; i<=100; i++) {
        sum += fun(i);
    }

    printf("%d", sum);

    return 0;
} 
//另一种解法

#include <stdio.h>  

int main()  
{  
    int i,n,sum;  

    sum = 0;  
    n = 0;  
    for (i = 1; i <= 100; ++i)  
    {  
    //
        n +=i;  
        sum += n;  
        printf("%d\n", n);  
    }  
    printf("%d\n", sum);  
    return 0;  
}  

第三题
平方怪圈

如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。

如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。

请写出这个循环圈中最大的那个数字。
请填写该最大数字。

#include<iostream>
#include<cstring>

using namespace std;

char s[100];

int fun(char *s) {
    int sum = 0;
    int len = strlen(s);

    //每个数都平方 
    for(int i=0; i<len; i++) {
        sum += (s[i]-'0')*(s[i]-'0');

    }
    return sum;
}

int main() {

    int num = 14;

    int MAX = 0;

    //根据题意,设置循环50次 
    for(int i=0; i<50; i++) {
        //因为要检测一个数一共有几位,所以把他转化为字符串,利用strlen就可以检测到,然后每个数都平方,再返回一个数值 
        sprintf(s, "%d", num);

        num = fun(s);

        //每一次都比较,把最大的放出来 
        MAX = max(MAX, num);
    }

    cout << MAX << endl;

    return 0;
}

第四题
打印方格
小明想在控制台上输出 m x n 个方格。
比如 10x4的,输出的样子是:
这里写图片描述

以下是小明写的程序,请你分析其流程,填写划线部分缺少的代码
#include<stdio.h>

void f(int m, int n) {
    int row;
    int col;

    for(row=0; row<n; row++) {
        for(col=0; col<m; col++)    printf("+---");
        printf("+\n");
        for(col=0; col<m; col++)    printf("|   ");
        printf("\n");
    }

    printf("+");
    //填写代码 
    printf("\n");
}

int main() {
    f(10,4);

    return 0;
}
//通过简单的调试,可以看出来。不难,题目很水,别粗心就好了
#include<stdio.h>

void f(int m, int n) {
    int row;
    int col;

    for(row=0; row<n; row++) {
        for(col=0; col<m; col++)    printf("+---");
        printf("+\n");
        for(col=0; col<m; col++)    printf("|   ");
        printf("|\n");
    }

    printf("+");
    //循环打印----------------------------------------
    for(col=0; col<m; col++)    printf("---+");
    printf("\n");
}

int main() {
    f(10,4);

    return 0;
}

第五题
快速排序

排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。

下面的代码是一种实现,请分析并填写划线部分缺少的代码。

复制代码

#include <stdio.h>

void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

int partition(int a[], int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];
while(1){
while(i<r && a[++i]<x);
while(a[--j]>x);
if(i>=j) break;
swap(a,i,j);
}
______________________;
return j;
}

void quicksort(int a[], int p, int r)
{
if(p<r){
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}

int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;

quicksort(a, 0, N-1);

for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");

return 0;
}

答案:看不懂的,建议百度快排,看一下原理

swap(a,p,j)


凑算式

这里写图片描述

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

//double型,这种题还是for好用啊!!!!!!
#include<stdio.h>


int main() {
    double a, b, c, d, e, f, g, h, i;
    double t1, t2, t3;
    int sum = 0;
    for(a=1; a<=9; a++) {
        for(b=1; b<=9; b++) {
            for(c=1; c<=9; c++) {
                for(d=1; d<=9; d++) {
                    for(e=1; e<=9; e++) {
                        for(f=1; f<=9; f++) {
                            for(g=1; g<=9; g++) {
                                for(h=1; h<=9; h++) {
                                    for(i=1; i<=9; i++) {
                                        if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i) {
                                            if(b!=c && b!=d && b!=e && b!=g && b!=h && b!=i && b!=f) {
                                                if(c!=d && c!=e && c!=f && c!=g && c!=h && c!=i) {
                                                    if(d!=e && d!=f && d!=g && d!=h && d!=i) {
                                                        if(e!=f && e!=g && e!=h && e!=i) {
                                                            if(f!=g && f!=h && f!=i) {
                                                                if(g!=h && g!=i) {
                                                                    if(h!=i) {
                                                                        t1 = a;
                                                                        t2 = b/c;
                                                                        t3 = (d*100+e*10+f)/(g*100+h*10+i);
                                                                        if(t1+t2+t3==10) {
                                                                            sum++;
                                                                            printf("%f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i);
                                                                            printf("%d\n", sum);
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
} 
//另一种使用DFS的方法
//我有博文专门介绍DFS的,大家可以去看一下
//这里主要是判断结束的条件有点难度

#include<stdio.h>  
//a b c d e f g h i
int a[10];
bool isVisit[10];  
int t1, t2, t3, sum=0;
void dfs(int num)  
{  
    if (num == 10)  
    {  
        //让后面两个分数通分
        t1 = a[3] * (a[7] * 100 + a[8] * 10 + a[9]);
        t2 = a[2] * (a[7] * 100 + a[8] * 10 + a[9]);
        t3 = a[3] * (a[4] * 100 + a[5] * 10 + a[6]);

        //如果后面两个式子是整数,则满足条件,具体为什么,自己好好想一下
        //一个整数肯定是加一个整数才能等于一个整数
        if((t2+t3) % t1 == 0){  
            if(a[1] + ((t2 + t3) / t1) == 10) {
                sum++;

            }
        }

    }  
    for (int i = 1; i < 10; i++)  
    {  
        if (isVisit[i] == 0)  
        {  
            isVisit[i] = 1;  
            a[num] = i;  
            dfs(num + 1);  
            isVisit[i] = 0;  
        }  
    }  
}  
int main()  
{  
    dfs(1);  
    printf("%d\n", sum);  
    return 0;  
}  

第六题

寒假作业

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:

□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □

(如果显示不出来,可以参见【图1.jpg】)

每个方块代表1~13中的某一个数字,但不能重复。
比如:
6 + 7 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5

以及:
7 + 6 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5

就算两种解法。(加法,乘法交换律后算不同的方案)

你一共找到了多少种方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

//当时第一时间就想到这种办法,但这样要运行很久很久才可以得出答案, 遍历所有可能,但step==13的时候判断条件,满足则SUM++;

#include<stdio.h>

int book[14], a[14];
int sum = 0;
void dfs(int step) {
    if(step == 13) {
        if(a[1]+a[2]==a[3] && a[4]-a[5]==a[6] && a[7]*a[8]==a[9] && a[10]/a[11]==a[12]) {
            sum++;
        }
    }

    for(int i=1; i<=13; i++) {
        if(book[i] == 0) {
            book[i] = 1;
            a[step] = i;
            dfs(step+1);
            book[i] = 0;
        }
    }

}


int main() {
    dfs(1);

    printf("%d", sum);

    return 0;
} 
//每循环完一个式子,就判断是否满足条件,如果不满足就跳过,这样可以很快速出答案
#include<stdio.h>

int book[14], a[14];
int sum = 0;

int judge(int n) {
    if(n == 3) {
        if(a[1] + a[2] != a[3])
            return 0;
    }

    if(n == 6) {
        if(a[4] - a[5] != a[6])
            return 0;
    }

    if(n == 9) {
        if(a[7] * a[8] != a[9])
            return 0;
    }

    if(n == 12) {
        if(a[10]%a[11]!=0 || a[10]/a[11]!=a[12])
            return 0;

        sum++; 
        printf("%d + %d = %d\n", a[1],a[2],a[3]);
        printf("%d - %d = %d\n", a[4],a[5],a[6]);
        printf("%d * %d = %d\n", a[7],a[8],a[9]);
        printf("%d / %d = %d\n", a[10],a[11],a[12]);
        printf("\n\n\n");
    }

    return 1;
}


void dfs(int step) {

    for(int i=1; i<=13; i++) {
        if(book[i] == 0) {
            book[i] = 1;
            a[step] = i;

            if(judge(step) == 0) {
                book[i] = 0;
                continue;
            }

            dfs(step+1);
            book[i] = 0;
        }
    }

}


int main() {
    dfs(1);

    printf("%d", sum);

    return 0;
} 

第八题
冰雹数
任意给定一个正整数N,
如果是偶数,执行: N / 2
如果是奇数,执行: N * 3 + 1

生成的新的数字再执行同样的动作,循环往复。

通过观察发现,这个数字会一会儿上升到很高,
一会儿又降落下来。
就这样起起落落的,但最终必会落到“1”
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。

比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。

输入格式:
一个正整数N(N<1000000)
输出格式:
一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。

例如,输入:
10
程序应该输出:
52

再例如,输入:
100
程序应该输出:
9232

//这道题反正我无语
//一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。
//表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。
//不大于N的数字,最高冲到了多少。
//我的北京啊,无缘啊
#include<stdio.h>

int n, MAX=0;

void fun(int n) {   

    if(n > MAX) MAX = n;

    if(n == 1)  return;


    if(n % 2 == 0) {
        n /= 2;
    } else {
        n = n * 3 + 1;
    }


    fun(n);

}

int main() {

    for(int i=9; i<=100; i++) { 
        printf("%d  ", i);
        fun(i); 
        printf("%d\n", MAX);
        MAX = 0;
    }

    return 0;
}

卡片换位

你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子

+—+—+—+
| A | * | * |
+—+—+—+
| B | | * |
+—+—+—+

在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。

你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。

输入格式:
输入两行6个字符表示当前的局面

输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)

例如,输入:
* A
**B

程序应该输出:
17

再例如,输入:
A B


程序应该输出:
12

暂时不会,留坑

密码脱落

X星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。

例如,输入:
ABCBA
则程序应该输出:
0

再例如,输入:
ABDCDCBABC
则程序应该输出:
3

暂时不会,留坑
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值