2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组

试题 A:组队

本题总分:5分
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员,
组成球队的首发阵容。
每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1
号位至5号位的评分之和最大可能是多少?

答案:490(该题需考虑清楚,一个人不能担任两个位置,98+99+98+97+98=490)

 

 

试题 B:年号字串
本题总分:5分
【问题描述】
小明用字母 A对应数字 1,B对应 2,以此类推,用 Z对应 26。对于 27
以上的数字,小明用两位或更长位的字符串来对应,例如 AA对应27,AB对
应28,AZ对应52,LQ对应329。
请问2019对应的字符串是什么?
答案:BYQ
(该题我做的时候是直接算了2019/26=77,AZ是52,所以BY对应77,2019%26=17,Q为17,所以答案为BYQ)
但该题考查的是26进制,代码如下
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int x = 2019;
    while(x){
        printf("%c", char(x%26+64));
        x/=26;
    }
    return 0;
}
//结果取反

 

试题c:数列求值

本题总分:10分
【问题描述】
给定数列1,1,1,3,5,9,17,…,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字

答案:4659

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int a, b, c, d;
    a = b = c = 1;//前三项 
    for(int i = 4; i <= 20190324; i++){
        d = (a+b+c)%10000;//控制后四位数 
        a = b;
        b = c;
        c = d;
    }
    printf("%d\n", d);
    return 0;
}
试题 D:数的分解
本题总分:10分
【问题描述】
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包
含数字2和4,一共有多少种不同的分解方法?
注意交换 3个整数的顺序被视为同一种方法,例如 1000+1001+18和
1001+1000+18被视为同一种。
 
#include<cstdio>
#include<algorithm> 
#include<iostream>
using namespace std;
bool check(int x)    //判断是否有2,4 
{
    while(x)
    {
        if(x%10==2||x%10==4)
           return true;    
        x/=10;
    }
    return false;
}
int main()
{
    int cnt=0;
    for(int i=1;i<=2019;i++)
    {
        if(check(i)) continue;
        for(int j=i+1;j<=2019;j++)
        {
            if(check(j)) continue;
            int k=2019-i-j;
            if(k<=i||k<=j||check(k))continue;
            cnt+=1;
        }
     } 
     cout<<cnt<<endl;
     return 0;
} 

其中i,j,k分别为三个整数,逐个模拟,边模拟边判断是否有数字2和4;

 

 

试题 F: 特别数的和
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小明对数位中含有 2、0、1、9 的数字很感兴趣 (不包括前导 0)  ,在 1 到
40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
40
【样例输出】
574
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 10。
对于 50% 的评测用例,1 ≤ n ≤ 100。
对于 80% 的评测用例,1 ≤ n ≤ 1000。
对于所有评测用例,1 ≤ n ≤ 10000。
 
#include<cstdio>
#include<algorithm> 
#include<iostream>
using namespace std;
int main()
{
    int n,sum=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(i%10==1||i/10==1||i%10==2||i/10==2||i%10==9||i/10==9||i%10==0)
          sum+=i;
    }
    cout<<sum<<endl;
}

 


试题 H: 等差数列
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一
部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有
几项?
【输入格式】
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 并不一定是按等差数
列中的顺序给出)
【输出格式】
输出一个整数表示答案。
【样例输入】
5
2 6 4 10 20
【样例输出】
10
【样例说明】
包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、
18、20。
 
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int w[maxn];
int ans[maxn];
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &w[i]);
    }
    if(w[1]==w[2])   //常数列的情况 
    {
        printf("%d", n);
        return 0;
    }
    sort(w+1, w+n+1);//先排序,从小到大 
    for(int i = 1; i < n; i++){
        ans[i] = w[i+1]-w[i];     //依次算出两数之差 
    }
    int G = ans[1];
    for(int i = 2; i <= n-1; i++){
        G = gcd(G, ans[i]);
    }
    printf("%d\n", (w[n]-w[1])/G+1);
    return 0;
} 

emmmmm。。。。。。就先写这几道题吧,毕竟还是小菜一只,等我弄懂其他的再补吧。

总之这次比赛很粗心,水题都没做对更别说其他的了,不过我会努力的。

posted @ 2019-03-31 14:53  蓉~  阅读(2227)  评论(0编辑  收藏  举报