• 2022年12月STEMAC++中级组编程题


    第一题:

    编程实现:求位数
    题目描述:
    给定一个正整数N(1 输入描述
    输入一个正整数N(1 输出描述
    输出一个整数,表示N为几位数。

    解析:这题可以直接通过循环除法求商得出有几位数。

    1. #include
    2. using namespace std;
    3. int main(){
    4.     int N;
    5.     cin>>N;
    6.     int ans = 0;
    7.     while(N>0){
    8.         N /= 10;
    9.         ans++; 
    10.     }
    11.     cout<
    12.     return 0;
    13. }


    第二题:

    编程实现:字符反转
    题目描述:
    给定一个只包含大写字母“M”和“W”的字符串(字符串长度小于100),
    然后对字符串中位置为偶数的字符进行反转(M反转为W,W反转为M;字符串中左边第1个字符位置为1)。
    例如:原字符串为“WMMW”,反转后为“WWMM”
    输入描述
    输入一个只包含大写字符“M”和“W”的字符串(字符串长度小于100)
    输出描述
    输出一个字符串,表示对原字符串中位置为偶数的字符反转后的字符串

    解析:本题考查字符串的操作,也是考查数组的操作。注意:题目中的序号和原来的字符串下标不同,字符序号=字符下标+1。通过遍历每个字符元素,如果满足序号是偶数就进行翻转。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(){
    5.     string str;
    6.     cin>>str;
    7.     for(int i=0;isize();i++){
    8.         if((i+1)%2==0){
    9.             if(str[i]=='W'){
    10.                 str[i]='M';
    11.             }
    12.             else if(str[i]=='M'){
    13.                 str[i]='W';
    14.             }
    15.         }
    16.     }
    17.     cout<
    18.     return 0;
    19. }

    第三题:

    编程实现:排名
    题目描述:
    某比赛有N(2≤N≤50)名选手参加,   N
    给定每名参赛选手的编号(1到N)和比赛得分(0≤得分≤100),  编号唯一 1-N
    请按照分数从高到低的顺序排序,如果分数相同就按照编号排序,
    分数从高到低     如果分数相同就按照编号排序
    编号小的排前边。

    解析:因为每一个选手有两个参数:编号和成绩,编号和成绩是对应的。可以使用一维数组来实现,也可以使用二维数组来实现。排序的方法可以使用冒泡/插入等,反正你会用哪个就用哪个。

    1. #include
    2. using namespace std;
    3. int main(){
    4.     int N;
    5.     cin>>N;//输入的要求
    6.     int a[N+1],b[N+1]; //设置N+1个元素,仅仅只是为了简单处理编号与下标对应问题 
    7.     //输入编号和成绩 
    8.     for(int i=1;i<=N;i++){
    9.         cin>>a[i]>>b[i];//满足输入描述中的第二行开始的要求
    10.         //scanf("%d %d",a[i],b[i]);
    11.     } 
    12.     //排序 
    13.     //冒泡排序。为了实现高到低排序
    14.     //每轮将最小的成绩移至最后::
    15.     for(int i=1;i
    16.         for(int j=1;j<=N-i;j++){//因为每轮比较都能将最小元素往后移 
    17.             int temp; 
    18.             if(b[j]1]){
    19.                 //成绩交换排序顺序
    20.                 temp = b[j];
    21.                 b[j] = b[j+1];
    22.                 b[j+1] = temp;
    23.                 //编号交换排序顺序
    24.                 temp = a[j];
    25.                 a[j] = a[j+1];
    26.                 a[j+1] = temp;
    27.             }
    28.             else if(b[j]==b[j+1]){
    29.                 if(a[j]>a[j+1]){//当成绩相同时,编号大往后排
    30.                     //编号交换排序顺序
    31.                     temp = a[j];
    32.                     a[j] = a[j+1];
    33.                     a[j+1] = temp;
    34.                 }
    35.             }
    36.         }
    37.         
    38.     } 

    //以上就是排序区域

     //输出区域:注意输出格式。按照排序规则输出N行,每行两个正整数,

     //分别表示编号和得分,正整数之间以一个空格隔开 

    1.  for(int k=1;k<=N;k++){
    2.         cout<" "<
    3.     } 
    4.      
    5.     return 0

    第四题:

    充电站
    题目描述:
    一条笔直的公路沿途有N(2≤N≤100)个充电站,包含起点和终点各一个。
    小明驾驶电动汽车要从公路的起点到达终点。
    已知电动汽车充满电后可行驶的里程数D(10≤D≤10000),
    及N个充电站每相邻的两个充电站之间的距离,
    并且小明在起点第一次给电动汽车充满电。
    请帮助小明计算出最少充电几次才能从起点到达终点
    (需包含起点的第一次充电)。

    注意:
    1)到达终点后不需要再充电;
    2)每次充电都要充满。

    例如:D = 10,N = 7,N-1
    7个充电站之间的距离依次为1,3,6,8,1,4,
    最少需要充电3次。

    第一次充电在起点(第1个充电站);  充电次数一开始就为1
    第二次充电在第4个充电站(此时行驶里程为10,刚好电量耗尽);
    第三次充电在第6个充电站(此时在第二次充满电后行驶里程为9,
    剩余电量只能行驶1,距离下一充电站的距离为4,所以必须在此充电站充电)。

    解析:需要注意充电次数从一开始就为1。可以使用一个临时变量作为汽车的当前剩余电量。

    1. #include
    2. using namespace std;
    3. int main(){
    4.     int D ,N;
    5.     cin>>D>>N;
    6.     int c[N-1];
    7.     //第二行输入N-1个正整数(1≤正整数≤100000),
    8.     //依次表示相邻两个充电站之间的距离,正整数之间以一个空格隔开
    9.     for(int i=0;i-1;i++){//输入N-1个正整数,表示各个充电站间的距离 
    10.         cin>>c[i]; 
    11.     } 
    12.     //注意:汽车在起点时有一个充电站,并且充满了电
    13.     //用一个变量ans来表示充电次数,初始值为1
    14.     int ans = 1;
    15.     int temp = D ;//D表示汽车的每次可充电上限,temp表示汽车的可用电量 
    16.     for(int i=0;i-2;i++) {//如果下一站距离超过了满电行驶上限 
    17.         if(c[i+1]>D){
    18.             ans = -1;//直接给-1 
    19.             break;
    20.         } 
    21.         temp -= c[i];//每次到达一个充电站消耗后剩余的电量
    22.         if(temp1]) {
    23.             temp = D;//充满电
    24.             ans++;//充电次数+1 
    25.         }
    26.     }
    27.     cout<
    28.     return 0

    第五题:

    猴子拿桃

    题目描述:

    有N筐桃子从左到右排成一排,已知每筐桃子的数量。现猴子要按照以下规则拿取桃子:

    1)猴子每次拿一筐桃子,一共要拿K次桃子;

    2)猴子只能按照从左到右的顺序拿取桃子,不能回头,且每次拿取桃子的数量不能少于(大于等于)上一次。

    当给定桃子筐数N(1≤N≤12)及每筐桃子的数量,和要拿取桃子的次数K(1≤K≤N),请编写程序,如果有符合规则的拿取方式,输出猴子最多可以拿到的桃子数量,否则输出0。

    例如:

    N = 4,4筐桃子的数量从左到右依次为16,12,16,17;

    K=3,猴子一共要拿3次桃子,符合规则的拿取方式有:[16,16,17],[12,16,17];

    其中可拿取到最多桃子的方式是:[16,16,17],合计为49。则猴子最多可以拿到49个桃子。

    输入描述
    第一行输入两个正整数N和K(1≤N≤12,1≤K≤N),分别表示桃子的筐数和一共要拿取桃子的次数,正整数之间以一个空格隔开

    第二行输入N个正整数(10≤正整数≤200),从左到右依次表示每筐桃子的数量,正整数之间以一个空格隔开

    输出描述
    输出一个整数,如果有符合规则的拿取方式,输出猴子最多可以拿到的桃子数量,否则输出0

    解析:使用一个临时变量当做滑动窗口,记录每次进行组合时下一个不小于当前数的位置。

    1. #include
    2. using namespace std;
    3. int main(){
    4.     int N,K;
    5.     cin>>N>>K;
    6.     //输入N个数
    7.     int a[N],b[K];
    8.     for(int i=0;i
    9.         cin>>a[i];
    10.     } 
    11.     //从第一个元素开始进行组合K个数,最多执行到N-K
    12.     /*2*/int count  = 0
    13.     int sum = 0;//计算组合的总和
    14.     int max = 0;//对总和求最大值 
    15.     for(int i=0;i
    16.         int temp = i;//在每回组合中,temp作为下标滑动窗口存在
    17.         b[0] = a[temp];//当前i的位置作为组合的第一个元素
    18.         /*2*/count = 1;
    19.         for(int j=1;j//对b[K]中的剩余位置进行填充 
    20.             //填充条件:下一个元素不小于(>=)现在元素
    21.             for(int k=temp;k
    22.                 if(a[k+1]>=a[k]){
    23.                     b[j] = a[k+1];
    24.                     /*2*/count++;
    25.                     temp = k+1;//更新窗口的所在下标 
    26.                     break
    27.                 } 
    28.             }    
    29.         } 
    30.         if(count
    31.             cout<<"0";
    32.             return 0;
    33.         } 
    34.         else{
    35.             sum = 0;
    36.             for(int i=0;i
    37.                 sum+=b[i];
    38.             } 
    39.             if(max
    40.                 max = sum;
    41.             }
    42.         }
    43.     } 
    44.     cout<
    45.     return 0;
    46. }
  • 相关阅读:
    抢答器设计
    ElasticSearch 一文读懂
    window文件夹下python脚本实现批量删除无法预览的图片
    开源大数据集群部署(十五)Zookeeper集群部署
    【Ubuntu笔记】录屏安装
    shell脚本中的运算符和条件判断
    【Java】人工智能交互智慧导诊系统源码
    Spring Boot Actuator 管理日志
    如何用R语言在机器学习中建立集成模型?
    美食杰项目重难点记录
  • 原文地址:https://blog.csdn.net/Qpeterqiufengyi/article/details/130904795