C/C++教程

第四届传智杯练习赛题解(c++)

本文主要是介绍第四届传智杯练习赛题解(c++),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

共五个题,难度一般。

目录

符合条件的数

选代表

成绩统计

背答案

击鼓传花


符合条件的数

题目描述:

给出 N 和 k,找到一个不小于 N的正整数,满足这个数中有 k位数字是 3,且尽可能小。

输入格式:

一行,两个整数 N(1 < =N<=10^9) 和k(1≤k≤6)。

输出格式:

输出一个数字表示答案。

输入输出样例:

输入:

2333334 6

输出:

3033333

题解:读入 n 和 k; 大循环:i 从 n 开始,往上面枚举; 小循环: 每次获得这个数字的个位数; 如果它是 3 计数器增加 1; 去掉它的个位数; 如果发现答案,就跳出循环并输出。

#include <cstdio>
#include <algorithm>
#include<iostream>
using namespace std;
int main() {
int i, k, n;
scanf("%d%d", &n, &k);
for (i = n; ; i++) {
int tmp = i, sum = 0;
while (tmp != 0) {
if(tmp % 10 == 3)
sum++;
tmp /= 10;
}
if(sum == k)
break;
}
cout << i;
return 0;
} 

选代表

题目描述:

传智专修学院竞选学生代表,获得了 n( 1≤n≤20000)个提名票,每个提名票都写了一个学号(从 1 到 100 的整数)。现在要求给根据提名票整理出竞选人。将这些提名票依次排列,只保留这个学号第一次出现的位置,删除同一学号其余出现的位置。然后输出这些学号。就是简单地去重问题。

输入格式:

输入包含两行:

第一行包含一个正整数 n,表示提名票的个数;

第二行包含 n 个整数,整数之间以一个空格分开。每个整数是提名票中的学号。

输出格式:

输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。

输入输出样例:

输入:

5
10 12 93 12 75

输出:

10 12 93 75

题解:使用 vis 数组,记录某一个数 字是否出现过。 读入 n 后,循环 n 次。 读入一个数; • 如果他没有出现过,就输出, 同时把它设置为出现过。 如果它出现过了就跳过。

#include <iostream>
using namespace std;
bool vis[105];//记录输入的数是否出现过
int main() {
int a, n;
cin >> n;
for(int i = 1; i <= n; i ++) {
cin >> a;
if(!vis[a]) {
cout << a << " ";
vis[a] = 1;
}
}
return 0;
} 

成绩统计

题目描述:

传智专修学院的“Java程序设计”班有 N(1≤100) 个学生,知道他们的个人信息和成绩:

  • 姓名(长度不超过 2020 的仅由小写字母组成的字符串)
  • 平时分成绩(00到 100 的整数)
  • 期末考试成绩(0 到 100 的整数)

由于期末考试有点难,为了让分数没那么难看,将期末考试成绩进行调分,调分后的期末成绩是将其开根号后乘 10,然后向上取整。

最后这个同学的总评得分是 60% 的调分后期末考试成绩,加上 40% 的平时分成绩,四舍五入精确到整数。

请对这些同学的成绩进行排名。

输入格式:

第一行一个整数 N。

接下来 N 行,每行包括一个字符串,和两个整数,用空格隔开,分表代表这个同学的姓名,平时分和期末考试成绩。

输出格式:

从高到低输出对应同学的姓名和总成绩。如果两个同学的得分相同,原来输入顺序靠前的,输出时也应当靠前。

输入输出样例:

输入:

4
a 60 36
b 70 49
c 50 25
d 60 36

输出:

b 70
a 60
d 60
c 50

题解:结构体,和自定义排序的使用。 读入信息后,使用 sort 排序。

#include <algorithm>
#include<iostream>
#include<cmath>
using namespace std;
struct stu {
string name;
int id, score;
} s[110];
bool cmp(stu &x, stu &y) {
if (x.score == y.score)
return x.id < y.id;
else
return x.score > y.score;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int mid, final;
cin >> s[i].name >> mid >> final;
s[i].id = i;
s[i].score = int(round(0.6 * ceil(10 * sqrt(final)) + 0.4 * mid));
}
sort(s, s + n, cmp);
for (int i = 0; i < n; i++) {
cout << s[i].name << ' ' << s[i].score<< endl;
}
return 0;
}

背答案

题目描述:

传智专修学院“Java程序设计”的期末考试来源于一个选择库,共有 n 道题目,每道题目由问题和答案组成,都是一个字符串,保证所有题目题面互不相同。这个题库已经发给同学进行备考准备。

正式考试中,试卷包含 q道题目,每道题目都有 4个选项,你需要从 4 个选项中选出与答案相符的选项。请你完成这场考试。

输入格式:

第一行两个正整数 n, q。

接下来 n行,每行 2 个用空格分隔的字符串,表示这道题目的问题和答案。

接下来 q 行,每行 5 个的字符串,用空格分隔。第一个字符串表示考试的问题,其余 4 个字符串分别为这道题目的ABCD选项,保证选项各不相同。

输出格式:

对于考试中的每道题,输出 A 或者 B 或者 C 或者 D 表示这道题目答案对应的选项,用换行隔开,保证所有题目均有解。

输入输出样例:

输入:

8 5
kqet qyf
kxyhfcbfy sorlawygdg
igklkkzmet lh
ijlvjtwirf osfumbui
iict mdz
tcdsczbopw yccknz
fun emdg
rsdsv tawdpyb
kqet pvc kfd uehtepa qyf
kxyhfcbfy ebrlaftges ehfe sorlawygdg kokdukzg
igklkkzmet veqiwikpr yohdgdpb lh nu
kqet eb jnf qyf qkf
iict ycleqorhek mda mdz ahgou

输出:

D
C
C
C
C

题解:使用字符串数组,记录题库 中,每个问题和对应的答案 在考试时,读入问题和四个 选项。 然后从头开始找题库,找到 这个问题后,依次把答案和 各个选项比较。 如果一致的话,就输出对应 选项的编号。

#include<iostream>
#include<string>
using namespace std;
struct A
{
	string x,y;	
};
A a[50000];
struct B
{
	string a,b,c,d,e;	
};
B b[5000];
int n,q;
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i].x>>a[i].y;
	for(int i=1;i<=q;i++)
		cin>>b[i].a>>b[i].b>>b[i].c>>b[i].d>>b[i].e;
	for(int i=1;i<=q;i++)
		for(int j=1;j<=n;j++)
		{
			if(b[i].a==a[j].x)
			{
				if(b[i].b==a[j].y) cout<<"A"<<endl;
				if(b[i].c==a[j].y) cout<<"B"<<endl;
				if(b[i].d==a[j].y) cout<<"C"<<endl;
				if(b[i].e==a[j].y) cout<<"D"<<endl;
			}
		}
	return 0;
 } 

击鼓传花

题目描述:

传智专修学院举办集体活动,由 n 个同学排成环形,编号 0至 n-1。

如果一个同学手里有花,他可以把花往编号更大的方向(或者重新从 0 开始数)传递给第 k个同学。如果第 i 个同学手里有花,那么下一秒这个花会传到第 (i+k)mod n 号同学的手上。

现在有 m个同学手里有花,编号分别是 p_i。随着时间的流逝,有些同学拿到过花,有些却一直没有拿到花。请问,有多少个同学永远不可能拿到花。

输入格式:

第一行,三个正整数 n,m,k,表示人数,花的个数,步长。

第二行,m 个非负整数 p_1,p_2,....p_m表示花最开始在哪些同学手上。

输出格式:

共一行,一个整数,表示答案。

输入输出样例:

样例1:

输入:

4 2 2
0 1

输出:

0

样例2:

输入:

4 2 2
0 2

输出:

2

题解:用数组表示是否访问过。 a[i] 表示第 i 个同学有没有访问过。 每次读入一个位置,一直往前跳。 这个位置是 t,下一个就是 (t+k)%n。 跳过的位置标记一下, 直到碰到跳过的位置。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000010
int n, m, k, t, a[N], ans;
int main() {
cin >> n >> m >> k;
for(int i = 0; i < m; i++) {
cin >> t;
if(a[t]) continue;
while(1) {
if(a[t] == 1) break;
a[t] = 1;
t += k;
t %= n;
}
}
for(int i = 0; i < n; i++) {
if(a[i] == 0) ans++;
}
cout << ans;
return 0;
}

这篇关于第四届传智杯练习赛题解(c++)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!