资讯详情

【2021-04】2020 蓝桥杯 A组 省赛 第二场 C++ A-H题

:小兰想为一条街的居民制作门牌号。 这条街一共有 2020 住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作门牌 0 到 9 这些数字据需要将这些数字字符粘贴在门牌上,如门牌 1017 要依次粘贴字符 1、 0、 1、 7,即需要 1 个字符 0, 2 个字符 1, 1 个字符 7.我想做一切 1 到 2020 号门牌需要多少个字符? 2? :这是一个填空结果的问题。你只需要计算结果并提交它。这个问题的结果是一个整数。提交答案时只填写整数,填写多余内容不会得分。

# include <iostream> using namespace std; int num_of_two(int n){ 
            int sum = 0;     while(n!=0){ 
                int tmp = n%10;         if(tmp==2) sum ;         n /= 10;     }     return sum; } int main(){ 
            int sum = 0;     for(int i=1;i<=2020;i )         sum  = num_of_two(i);     cout<<sum;     return 0; } 

:624

:如果一个分子和分母的最大公约数是 1,这个分数称为既约分数。 例如,34 , 52 , 18 , 71 都是既约分数。 请问有多少既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)? :这是一个填空结果的问题。你只需要计算结果并提交它。这个问题的结果是一个整数。提交答案时只填写整数,填写多余内容不会得分。

# include <iostream> using namespace std; ///最大公约数是否为1 bool divide(int a,int b){ 
       
    int c;
    while(b!=0){ 
       
        c = a%b;
        a = b;
        b = c;
        if(b==0) break;
    }
    return a==1?true:false;
}
int main(){ 
       
    int sum = 0;
    for(int i=1;i<=2020;i++)
        for(int j=1;j<=2020;j++)
            if(divide(i,j)) sum++;
    cout<<sum;
    return 0;
}

:2481215

:如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1    2    6    7    15 … 3    5    8    14 … 4    9    13 … 10  12 … … 容易看出矩阵第二行第二列中的数是5。请计算出矩阵第20行第20列的数是多少? :这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

# include <iostream>
using namespace std;
int main(){ 
       
    int gap = 0;
    int num = 1;
    int n = 20;
    while(n--){ 
       
        num += gap;
        gap += 4;
    }
    cout<<num;
    return 0;
}

:761

D题题目图片

:上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。请问,小蓝可以用七段码数码管表达多少种不同的字符? :这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 :用深度优先遍历枚举每一种可能,然后检测是否可行,注意检测是否可行时的条件,很容易算错。

# include <iostream>
# include <vector>
# include <fstream>
using namespace std;
int arr[7] = { 
       0,1,2,3,4,5,6};//并查集数组
bool vis[7];//访问数组
vector<vector<int>> vec;//存储每一种排列
vector<int> v;//单个排列
int graph[7][7];//存储可达矩阵
int sum = 0;//种类数
void dfs(int idx){ 
       
    if(vis[idx]) return ;
    vis[idx] = true;
    v.push_back(idx);
    vec.push_back(v);//加入队列
    for(int i=idx+1;i<7;i++)
        dfs(i);
    v.pop_back();//删除最后一个元素
    vis[idx] = false;
}

void check(vector<int> vt){ 
       
    if(vt.size()==1){ 
       
        sum++;return ;
    }
    for(int i=0;i<7;i++) arr[i] = i;
    for(int i=0;i<vt.size();i++) { 
       
        for (int j = 0; j < vt.size(); j++)
            if (graph[vt[i]][vt[j]] == 1) { 
       
            /*----------注意这里的处理,很容易算错----------*/
                int tmp = arr[vt[j]];
                for (int k = 0; k < vt.size(); k++)
                    if (arr[vt[k]] == tmp)
                        arr[vt[k]] = arr[vt[i]];
                /*----------注意这里的处理,很容易算错----------*/
            }
    }
    for(int i=1;i<vt.size();i++)
        if(arr[vt[i]]!=arr[vt[i-1]]) return ;
    sum++;
}
int main(){ 
       
    //读入文件
    fstream in("./number.txt");
    //可达矩阵
    for(int i=0;i<7;i++)
        for(int j=0;j<7;j++)
            in>>graph[i][j];
    //深度优先遍历 => 得出所有排列情况
    for(int i=0;i<7;i++)
        dfs(i);
    //将所有排列检测是否存在不连续的段
    for(int i=0;i<vec.size();i++)
        check(vec[i]);
    //输出结果
    cout<<sum;
    return 0;
}

1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1

:80

:平面上有N条直线,其中第i条直线是y = Ai*x+Bi。 请计算这些直线将平面分成了几个部分。 :第一行包含一个整数N。以下N行,每行包含两个整数Ai,Bi。 :一个整数代表答案。 : 3 1 1 2 2 3 3 : 6 : 对于50%的评测用例,1≤N≤4,-10≤Ai,Bi≤10。 对于所有评测用例,1≤N≤1000,-100000≤Ai,Bi≤100000。

# include <iostream>
# include <set>
using namespace std;
int main(){ 
       
    int n,sum = 1;
    cin>>n;
    pair<int,int> pi,pj;//斜率和截距
    pair<double,double> pt;//交点坐标
    set<pair<int,int> > s;
    int k,b;
    for(int i=0;i<n;i++){ 
       
        cin>>k>>b;
        s.insert(pair<int,int>(k,b));
    }
    set<pair<int,int> >::iterator i,j;
    for(i=s.begin();i!=s.end();i++){ 
       
        set<pair<double,double> > ctr;
        for(j=s.begin();j!=i;j++){ 
       
            pi = *i,pj = *j;
            if(pi.first==pj.first) continue;//平行
            else{ 
       
                pt.first = 1.0*(pj.second-pi.second)/(pi.first-pj.first);//交点横坐标
                pt.second = pt.first*pi.first + pi.second;//交点纵坐标
                ctr.insert(pt);//记录交点
            }
        }
        if(ctr.size()==0) sum++;
        else sum += (ctr.size()+1);
    }
    cout<<sum;
    return 0;
}

:小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 :输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。 :输出三行。 第一行包含一个整数,表示最高分。 第二行包含一个整数,表示最低分。 第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。 : 7 80 92 56 74 88 99 10 : 99 10 71.29 : 对于 50% 的评测用例,1 ≤ n ≤ 100。 对于所有评测用例,1 ≤ n ≤ 10000。

# include <iostream>
# include <iomanip>
using namespace std;
int main(){ 
       
    int n;
    int maxn = 0,minn = 100,score = 0;
    float avgn = 0;
    cin>>n;
    for(int i=0;i<n;i++){ 
       
        cin>>score;
        if(maxn<score) maxn = score;
        if(minn>score) minn = score;
        avgn += score;
    }
    cout<<maxn<<endl<<minn<<endl<<setiosflags(ios::fixed)<<setprecision(2)<<(avgn*1.0/n);
    return 0;
}

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

以下代码只通过90%测试用例,大家可以帮我看看有哪些缺陷。

# include <iostream>
# include <string>
using namespace std;
//字符串转数字
int toInt(string str,int begin,int end){ 
       
    int num = 0;
    int bits = 1;
    for(int i=end;i>=begin;i--){ 
       
        num += (str[i]-48)*bits;
        bits *= 10;
    }
    return num;
}
//翻转字符串
string reverse(string str){ 
       
    int len = str.length();
    int mid = len>>2;
    for(int i=0;i<=mid;i++){ 
       
        char tmp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = tmp;
    }
    return str;
}
//数字转字符串
string toStr(int num,int bits){ 
       
    string str = "";
    while(num!=0){ 
       
        int bit = num%10;
        str += (char)(bit+48);
        num /= 10;
        bits--;
    }
    while(bits--)
        str += '0';
    str = reverse(str);
    return str;
}
int main(){ 
       
    string date1;
    cin>>date1;
    int y1 = toInt(date1,0,3),m1 = toInt(date1,4,5),d1 = toInt(date1,6,7);
    string str1,str2;
    bool f1 = false,f2 = false;
    for(int i=y1+1;;i++){ 
       
        string str = toStr(i,4);
        str += reverse(str);//必定是回文的日期
        int year = toInt(str,0,3);
        int month = toInt(str,4,5);
        int day = toInt(str,6,7);
        //不符合要求的日期筛选掉
        if((year==y1 && month<m1) || (year==y1 && month==m1 && day<d1)) continue;
        if(month<1 || month>12 || day<1) continue;
        if((month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) && day>31) continue;
        if((month==4 || month==6 || month==9 || month==11) && day>30) continue;
        if(month==2){ 
       
            if(((year%4==0 && year%100!=0)|| year%400==0) && day>29) continue;
            else if(day>28) continue;
        }
        //当前必定为回文日期
        if(!f1){ 
       
            f1 = true;str1 = str;
        }
        //检测是否为ABABBABA型
        if(!f2 && str[0]==str[2] && str[2]==str[5] && str[5]==str[7]
            && str[1]==str[3] && str[3]==str[4] && str[4]==str[6] && str[4]!=str[7] 

标签: 二极管pj3306

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台