第十一届蓝桥杯C++省赛B组题解(二)

七段码

题目:

小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上
一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?

答案: 80
代码:

#include <iostream>
using namespace std;

int ans=0; //ans种不同字符
int light[8]; //7个数码管的发光情况
int father[8]; //并查集所有元素的父结点
int pipe[8][8]=
{
    
    
   {
    
    0,0,0,0,0,0,0,0},
   {
    
    0,0,1,0,0,0,1,0},
   {
    
    0,1,0,1,0,0,0,0},
   {
    
    0,0,1,0,1,0,0,1},
   {
    
    0,0,0,1,0,1,0,0},
   {
    
    0,0,0,0,1,0,1,1},
   {
    
    0,1,0,0,0,1,0,1},
   {
    
    0,0,1,1,0,1,1,0}
};//初始化数码管数组

//查找根结点
int findFather(int i)
{
    
    
    if(i != father[i])
        i = findFather(father[i]);
    return i;
}

//有相邻的并且发光的数码管合并为一个集合
void Union(int a,int b)
{
    
    
    int fa = findFather(a);
    int fb = findFather(b);
    if(fa != fb && light[a] && light[b] && pipe[a][b])
        father[fa] = fb;
}

//列举数码管发光的所有情况
void dfs(int x)
{
    
    
    //当x>7时,当前所有数码管的发光情况均已确定
    if(x > 7)
    {
    
    
        //初始化所有结点的父结点
        for(int i=1;i<8;i++)
            father[i] = i;

        for(int i=1;i<8;i++)
        {
    
    
            for(int j=1;j<8;j++)
            {
    
    
                Union(i,j);
            }
        }
        int y = 0; //连通集个数
        for(int i=1;i<8;i++)
            if(i==father[i] && light[i])
                y++;
        if(y == 1)
            ans++;
        return;
    }
    light[x] = 0; //第x个数码管不发光
    dfs(x+1);
    light[x] = 1; //第x个数码管发光
    dfs(x+1);
}

int main()
{
    
    
    dfs(1);
    cout << ans;
    return 0;
}

成绩统计

题目:

【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
四舍五入保留整数。

代码:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    
    
    int n,scores;
    cin >> n;
    double a=0.0,b=0.0;


    for(int i=0;i<n;i++)
    {
    
    
        cin >> scores;
        if(scores >= 60)
            a++;
        if(scores >= 85)
            b++;
    }
    cout << round(a/n*100) << "%" << endl;
    cout << round(b/n*100) << "%" << endl;
    return 0;
}

回文日期

题目:

【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按“yyyymmdd”的格式写
成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上“千年一遇”,顶多算“千年两遇”。给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
【输出格式】
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
【样例输入】
20200202
【样例输出】
20211202
21211212

代码:

#include <iostream>
#include <math.h>

using namespace std;

bool leapYear(int year)
{
    
    
    if((year%100!=0 && year%4==0) || year%400==0)
        return true;
    else
        return false;
}
bool huiwei(int y,int m,int d)
{
    
    
    if(y/100 == (d%10)*10+d/10)
    {
    
    
        if(y%100 == (m%10)*10+m/10)
            return true;
        else
            return false;
    }
    else
        return false;
}

int main()
{
    
    
    int n,year,month,day;
    int c=0;
    int m[13]={
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};
    cin >> n;
    year = n/10000;
    month = (n%10000)/100;
    day = n%10;
    while(1)
    {
    
    
        if(leapYear(year))
            m[2] = 29;
        else
            m[2] = 28;

        day++;
        if(day > m[month])
        {
    
    
            day = 1;
            month++;
        }
        if(month > 12)
        {
    
    
            month = 1;
            year++;
        }
        if(huiwei(year,month,day) && !c)
        {
    
    
            cout << year*10000+month*100+day << endl;
            c++;
        }
        if(huiwei(year,month,day))
        {
    
    
            if(year/100 == year%100 || month == day)
            {
    
    
                cout << year*10000+month*100+day << endl;
                break;
            }
        }
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_43790779/article/details/115239506