這里寫自定義目錄標題
- 2019年全國高校計算機能力挑戰賽C++組初賽
- 1題目一
- 題目二
- 題目三
- 題目四
- 題目五
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;
}
題目二
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;
}
題目三
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;
}
題目四
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;
}
題目五
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/216056.html
標籤:其他
下一篇:中職計算機基礎知識點筆記(四)
