zoukankan      html  css  js  c++  java
  • 2019年全国高校计算机能力挑战赛初赛C++语言解答

    1; 题目一

    16.电商促销某种商品时,希望通过打折鼓励消费者组团消费。已知,团队消费金额=该团的人数和*商品单价。打折规则如下:
    当组团消费者数量不满50人时,商品消费金额没有折扣;消费者数量大于等于50,但小于100人时,商品消费金额打9折;消费者数量达到或超过100人时,商品消费金额打85折。
    现在有一批团购信息(含团购人数和商品单价,每人限购一件商品),请计算该团折扣后实际消费金额。
    输入说明:某团的人数和商品单价。
    输出说明:求该团的折扣后的实际消费金额。
    输入样例:100 50

    输出样例:4250

    #include<iostream>
     using namespace std;
     
    int main(){
         int n,m;
         double res;
         cin>>n>>m;
         if(n<50){
             
         }else if(n<100){
             res=m*0.9;
         }else{
             res=m*0.85;
         }
         cout<<n*res;
         return 0;
     }

    2:题目二

    17.对于给定的十进制整数N(N<100000),将1到N(含N)之间的每个整数转成八进制,求转换后的所有八进制数中含7的总个数。
    提示:某个数的八进制含7的个数可以参照下面的例子:
    对于整数127,对应的八进制为177,其含7的个数为2。
    输入说明:输入整数N输出说明:输出含7的总个数
    输入样例:8

    输出样例:1

    #include<iostream>
    using namespace std;
    int l=0,ans[500]= {0};
    int res=0;
    void change(int x)
    {
        if(x<8)
        {
            ans[l++]=x;
            for(int i=l-1; i>=0; i--)
            {
                //cout<<ans[i];
                if(ans[i]==7){
                    res++;
                }
            }
            return;
        }
        else
        {
            ans[l++]=x%8;
        }
        change(x/=8);
    } 
    int main(){
         int n,i;
             cin>>n;
         for(i=0;i<n;i++){
             change(n);
         }
         cout<<res;
         return 0;
     }

    3:题目三

    18.输入N个整数,从中挑选符合以下规则的三种类型的数,分别输出。
    (1)个位数字为1、4或7的数;(2)个位数字为2、5或8的数;个位数字为3、6或9的数。
    输入说明:第一行输入整数个数N;第二行输入这N个整数。
    输出说明:分三行输出,第一行输出符合条件(1)的数据,第二行输出符合条件(2)的数据,第三行输出符合条件(3)的数据;备注:某行如果没有任何数据,输出空行

    输入样例:10

    11 12 13 24 25 26 37 38 39 40

    输出样例:

    11 24 37

    12 25 38

    13 26 39

    #include<iostream>
    using namespace std;
    void solution(int arr[],int n,int sw){
        switch(sw){
            case 1:
                for(int i=0;i<n;i++){
                    if(arr[i]%10==1||arr[i]%10==4||arr[i]%10==7){
                        cout<<arr[i]<<" ";
                    }
                }
                break;
            case 2:
                for(int i=0;i<n;i++){
                    if(arr[i]%10==2||arr[i]%10==5||arr[i]%10==8){
                            cout<<arr[i]<<" ";
                    }
                }
                break;
            case 3:
                for(int i=0;i<n;i++){
                    if(arr[i]%10==3||arr[i]%10==6||arr[i]%10==9){
                        cout<<arr[i]<<" ";
                    }
                }
                break;
        }
    }
    int main(){
         int n,i;
         int arr[100000]={0};
         cin>>n;
         for(i=0;i<n;i++){
             cin>>arr[i];
         }
         for(i=0;i<3;i++){
             solution(arr,n,i+1);
             cout<<endl;
         }
         return 0;
     }

    4题目四

    19.在N(N<30)名运动员参加的体操比赛中,有K(K<10)名裁判给每位运动员分别打分,按规则每名运动员最后得分需去掉一个最高分和一个最低分,然后把其他裁判的打分相加,计算得出该运动员的总得分(规定数据中每名运动员的总得分各不相同)。现在比赛完毕,根据总得分高低排序得出冠军、亚军。
    请你帮忙算出冠军和亚军,并输出他们的姓名。
    输入说明:第一行输入整数N和K。N表示运动员人数,K表示裁判人数;从第二行开始,依次分行输入这N名运动员的数据(数据格式为:姓名各裁判的整数打分,其中每名运动员的姓名不含空格,每名裁判的打分以空格分隔)。
    输出说明:输出冠军和亚军运动员的姓名,以单个空格分开他们的姓名。
    输入样例:5 4
    Zhang 85 85 90 80
    Wang 85 90 80 90

    Zhao 90 92 85 90

    Li 75 80 85 80
    Yang 81 75 80 85

    输出样例:Zhao Wang

    #include<bits/stdc++.h>
    using namespace std;
    struct Athlete{
        string name;
        int sco[11]={0};//有K(K<10)名裁判
    };
    bool compare(int a,int b)
    {
        return a<b; 
    }
    void out(Athlete p[],int n,int m){
        for(int i=0;i<n;i++){
             cout<<p[i].name;
             for(int j=0;j<m;j++){
                 cout<<p[i].sco[j]<<" ";
             }
         }
    }
    int main(){
         int n,m;
        Athlete p[31];
        int finalsco[31]={0};
         cin>>n>>m;
         for(int i=0;i<n;i++){
             cin>>p[i].name;
             for(int j=0;j<m;j++){
                 cin>>p[i].sco[j];
             }
         }
         for(int i=0;i<n;i++){
             sort(p[i].sco,p[i].sco+4,compare);
         }
         for(int i=0;i<n;i++){
             for(int j=1;j<m-1;j++){
                 finalsco[i]+=p[i].sco[j];
             }
         }
         int indexone=0;
         int MaxSco=0;
         for(int i=0;i<n;i++){
             if(MaxSco<finalsco[i]){
                 MaxSco=finalsco[i];
                 indexone=i;
             }
         }
         int indextwo=0;
         MaxSco=0;
         for(int i=0;i<n;i++){
             if(i==indexone) continue;
             if(MaxSco<finalsco[i]){
                 MaxSco=finalsco[i];
                 indextwo=i;
             }
         }
         cout<<p[indexone].name<<" "<<p[indextwo].name;
        //out(p,n,m);
         return 0;
     }
     

    5题目五

    20.已知结点元素值为正整数且值不相同的一棵二叉树。该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。输入一个整数x,针对此二叉树编写程序求出x的右子树中所有结点值的和(若×不在树上,输出-1)。
    输入说明:第一行输入某二叉树的先序遍历序列
    第二行输入该二叉树的中序遍历序列
    第三行输入正整数x输出说明:若×在树上,输出其右子树所有结点值的和(如果右子树为空,输出0);如果×不在树上则输出-1。
    输入样例1:20 15 10 12 18 16 17 25 30 10 12 15 16 17 18 20 25 30

    输出案例1:51

    输入样例2:20 15 10 12 18 16 17 25 30 10 12 15 16 17 18 20 25 30

    输出案例2:0

    输入样例3:20 15 10 12 18 16 17 25 30 10 12 15 16 17 18 20 25 30

    输出案例3:-1

     思路: 找到前序的中点, 遍历中序的排列 找到中序树的与前序对应的根节点,即为 下标的左边即为 是否存在的值 不存在输出-1

    下面写到一半觉得没有必要这样写 ,应为根据中序可以直接求出右子树的值

    #include<stdio.h> 
    #include<stdlib.h>
    typedef int eleType;
    typedef struct BiTree{
        eleType data;
        struct BiTree* lt;
        struct BiTree* rt;
    }BiTreeNode;
    
    BiTreeNode* createTree(eleType *pre,eleType *mid,int number){
        if(number==0)return NULL;//无节点返回null
        eleType ele=pre[0];// 头节点
        int i=0;
        //for(i=0;i<number&&ele!=mid[i];i++);
        while(i<number && mid[i]!=ele)i++;
        int leftNodeNum=i;
        int rightNodeNum=number-i-1;
        
        BiTreeNode *node=(BiTreeNode*)malloc(sizeof(BiTreeNode));
        node->data=ele;
        node->lt=createTree(&pre[1],&mid[0],leftNodeNum);// 创建左节点 
        node->rt=createTree(&pre[leftNodeNum+1],&mid[leftNodeNum+1],rightNodeNum);// 创建左节点
        return  node;
    }
    void printT(BiTreeNode *node){
        if(node==NULL)return;
        if(node->data!=0)printf("%d ",node->data);
        printT(node->lt);
        printT(node->rt);
    }
    void printT2(BiTreeNode *node){
        if(node==NULL)return;
        printT(node->lt);
        if(node->data!=0)printf("%d ",node->data);
        printT(node->rt);
    }
    int main(){
        
        char testa[]="12473568";//20 15 10 12 18 16 17 25 30 
        char testb[]="47215368";//10 12 15 16 17 18 20 25 30
        
        int inputa[100]={20,15,10,12,18,16,17,25,30};
        int inputb[100]={20,15,10,12,18,16,17,25,30};
        BiTreeNode *node;
        node=createTree(inputa,inputb,sizeof(inputa)/sizeof(inputa[0]));
        printT2(node);
        return 0;
    }
  • 相关阅读:
    产生财务计帐周期
    判断指定年份是否为闰年
    判断是否是闰年
    Regex quick reference
    组合外键(FOREIGN KEY)
    多列组合为主键(PRIMARY KEY)
    获取字符串开始的地址(案例)
    获取字符串结尾的电话号码(案例)
    ms sql server line feed
    如何产生连续时间?(案例)
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11875541.html
Copyright © 2011-2022 走看看