2020年寒假天梯赛基础训练题01

7-1 特殊a串数列求和 (20分)

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:
输入在一行中给出不超过9的正整数a和n。

输出格式:
在一行中按照“s = 对应的和”的格式输出。

输入样例:
2 3

输出样例:
s = 246

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n;
    int t;
    int temp,s = 0;
    cin >> t >> n;
    temp = t;
    for (int i = 0; i < n; i++) {
        s += temp;
        temp = temp * 10 + t;
    }
    cout << "s = " << s;
    return 0;
}

7-3 Shuffling Machine (20分)

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.

The machine shuffles a deck of 54 cards according to a given random order and repeats for a given number of times. It is assumed that the initial status of a card deck is in the following order:

S1, S2, …, S13,
H1, H2, …, H13,
C1, C2, …, C13,
D1, D2, …, D13,
J1, J2

where “S” stands for “Spade”, “H” for “Heart”, “C” for “Club”, “D” for “Diamond”, and “J” for “Joker”. A given order is a permutation of distinct integers in [1, 54]. If the number at the i-th position is j, it means to move the card from position i to position j. For example, suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.

Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer K (≤20) which is the number of repeat times. Then the next line contains the given order. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print the shuffling results in one line. All the cards are separated by a space, and there must be no extra space at the end of the line.

Sample Input:

2
36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7 8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33 34 35 45 46 47

Sample Output:

S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4 H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12 C6 C7 C8 C9 S2 S8 S9 H10 D5 D6 D7 H4 H13 C5

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int tr[60];//存储洗牌变化序列
	int k;
	int x;
	string s[60],t[60];//二维数组
	string f[5] = { "0","S","H","C","D" };//为字符串赋值!!!(用双引号,单引号是为字符数组赋值)
	cin >> k;
	for (int i = 1; i <= 4; i++) {
		for (int j = 1; j <= 13; j++) {
			s[(i - 1) * 13 + j] = f[i] + to_string(j);//用to_string方法将数字转化为字符串,但是不能用此方法转化字符
		}
	}
	s[53] = "J1";
	s[54] = "J2";
	
	//输入变化序列
	for (int i = 1; i <= 54; i++) {
		cin >> tr[i];
	}

	//洗牌过程
	for (int r = 0; r < k; r++) {
		for (int i = 1; i <= 54; i++) {
			t[tr[i]] = s[i];
		}
		for (int i = 1; i <= 54; i++) {
			s[i] = t[i];
		}
	}
	//输出
	cout << s[1];
	for (int i = 2; i <= 54; i++) {
		cout << " " << s[i];
	}
	return 0;
}

7-6 互评成绩 (25分)

学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。

输入格式:
输入第一行给出3个正整数N(3 < N ≤10
​4
​​ ,学生总数)、k(3 ≤ k ≤ 10,每份作业的评审数)、M(≤ 20,需要输出的学生数)。随后N行,每行给出一份作业得到的k个评审成绩(在区间[0, 100]内),其间以空格分隔。

输出格式:
按非递减顺序输出最后得分最高的M个成绩,保留小数点后3位。分数间有1个空格,行首尾不得有多余空格。

输入样例:
6 5 3
88 90 85 99 60
67 60 80 76 70
90 93 96 99 99
78 65 77 70 72
88 88 88 88 88
55 55 55 55 55

输出样例:
87.667 88.000 96.000

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
	int n, k, m;
	float score[10010];
	float h[15];
	float sum = 0;
	cin >> n >> k >> m;
	for (int i = 0; i < n; i++) {
		sum = 0.0;
		for (int j = 0; j < k; j++) {
			cin >> h[j];
			sum += h[j];
		}
		score[i] = (sum - *max_element(h, h + k) - *min_element(h, h + k)) * 1.0 / (k - 2);
	}
	sort(score, score + n);
	for (int i = n - m; i < n; i++) {
		printf("%.3f", score[i]);
		if (i != n - 1) {
			cout << " ";
		}
	}
	return 0;
}

7-7 银行业务队列简单模拟 (25分)

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

输入格式:
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。

输出格式:
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。

输入样例:
8 2 1 3 9 4 11 13 15

输出样例:
1 3 2 9 11 4 13 15

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int n;
	int p[1010], x;
	int flag;
	queue <int>A,B;//两个队列分别代表两个窗口上的客户
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> x;
		if (x % 2 == 1) {
			A.push(x);
		}
		else
			B.push(x);
	}
	//定义的flag用来存储所有的人中最后一个办理完的人,用来在输出最后一个空格时的判断标志
	if (A.size() / 2 >= B.size()) {
		flag = A.back();
	}
	else {
		flag = B.back();
	}
	//此题重点是输出,在最后末尾不能输出空格,这是难点。
	for (int i = 1; i <= n; i++) {
		if (!A.empty()) {
			cout << A.front();
			if (A.front() != flag)
				cout << " ";
			A.pop();
		}
		if (!A.empty()) {
			cout << A.front();
			if (A.front() != flag)
				cout << " ";
			A.pop();
		}
		if (!B.empty()) {
			cout << B.front();
			if (B.front() != flag)
				cout << " ";
			B.pop();
		}
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值