2018团队设计天梯赛题解---华⼭论剑组
写在前⾯
证件照的要求2018 年度的团队设计天梯赛前⼏天结束了。但是成绩真的是惨不忍睹。。。毕竟是团队的⽐赛,如果团队平均⽔平不⾼的话,单凭⼀个⼈,分再⾼也很难拉起来(当然,⼀个⼈能单挑⼀个队的⼤神除外)。
说实话吧,其实这段话原本不想写,⼀个是团队成绩并不好,另⼀个也是⾃⼰发挥的也不好,没有达到⽬标分数。但是想想不管怎样都是⼀种经历,所以还是写了这段话。
总结⼀下其实很多题放在平时做的话其实并不难,关键是⼼得放下来。但是⼀到⽐赛的氛围就不⼀样了,周围全是别的学校的⼤⽜,⼜加上有时间限制和周围的⼀堆监考⼈员围着⾛,想要放平⼼态其实是不容易的。这种东西还真得多经历才会有感觉。好了,今天写了⼀部分的题,来记录下题解:
L1-1 天梯赛座位分配(20 分)
天梯赛每年有⼤量参赛队员,要保证同⼀所学校的所有队员都不能相邻,分配座位就成为⼀件⽐较⿇烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ⽀队伍,每队 10 位参赛选⼿。令每校选⼿排成⼀列纵队,第 i+1 队的选⼿排在第 i 队选⼿之后。从第 1 所学校开始,各校的第 1 位队员顺次⼊座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还
没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,⾃动为各校⽣成队员的座位号,从 1 开始编号。
输⼊格式:
输⼊在⼀⾏中给出参赛的⾼校数 N (不超过100的正整数);第⼆⾏给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所⾼校的参赛队伍数,数字间以空格分隔。
韩国娱乐圈种子输出格式:
从第 1 所⾼校的第 1 ⽀队伍开始,顺次输出队员的座位号。每队占⼀⾏,座位号间以 1 个空格分隔,⾏⾸尾不得有多余空格。另外,每所⾼校的第⼀⾏按“#X”输出该校的编号X,从 1 开始。
说好不哭mv女主输⼊样例:
3
342
输出样例:
#1
14710131619222528
31343740434649525558
61636567697173757779
#2
25811141720232629
32353841444750535659
62646668707274767880
828486889092949698100
#3
36912151821242730
33363942454851545760
第⼀题其实意思不难理解,就是坑有点多,思路就是模拟题意去做就⾏了。普遍的坑就是第⼆个测试点和第三个测试点。
对于第⼆个测试点过不了的情况,可以试试下⾯的输⼊数据:
2
5 1
如果结果对了,第⼆个测试点也就过了。
对于第三个测试点可以试试只有⼀个学校的情况:
1
2
最后是 AC 代码:
/**
* 先分配第⼀个学校第⼀个队的第⼀个队员,再分配第⼆个学校的第⼀个队的第⼀个队员,
* 再分配第三个学校的第⼀个队的第⼀个队员... 最后⼀个学校的第⼀个队的最后⼀个队员。
* 所有学校的第⼀个队分配完毕,接下来是第⼀个学校的第⼆个队的第⼀个队员,
* 第⼆个学校的第⼆个队的第⼀个队员,第三个学校的第⼆个队的第⼀个队员...
*/
#include <iostream>
using namespace std;
const int MAXN = 110;
int schoolNum[MAXN]; // 记录每个学校的队数
int peo[MAXN][10][10]; // 记录每个队员的编号
int main() {
int n;
int maxx = 0;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", schoolNum + i);
maxx = max(maxx, schoolNum[i]);
}
int t, lastSchool = -1; // 上⼀次分配位置的队员所在的学校
int startPos = 0; // 开始位置
for (int j = 0; j < maxx; j++) { // 第 j 个队
for (int k = 0; k < 10; k++) { // 每个队 10 个⼈
for (int i = 0; i < n; i++) { // n 个学校
if (schoolNum[i] <= j) {
continue;
}
// 如果上⼀次分配位置的队员和现在分配位置的队员在同⼀个学校
// 那么证明是同⼀所学校的队员,需要间隔⼀个位置。
if (lastSchool == i) {
startPos += 2;
} else { // 否则证明是不同的学校的队员,相邻座就好
startPos++;
}
peo[i][j][k] = startPos;
lastSchool = i; // 更新上⼀次分配位置的队员所在的学校
}
}
}
for (int i = 0; i < n; i++) {
cout << "#" << (i+1) << endl;
for (int j = 0; j < schoolNum[i]; j++) {
中秋文案短句创意for (int k = 0; k < 10; k++) {
if (k) {
cout << " ";
}
cout << peo[i][j][k];
}
cout << endl;小甜甜布莱妮
于明加女儿}
}
return0;
}
L1-2 倒数第N个字符串(15 分)
给定⼀个完全由⼩写英⽂字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, …, aaz, aba, abb, …, abz, …, zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的L,本题要求你给出对应序列
倒数第 N 个字符串。
输⼊在⼀⾏中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10
5
)。
输出格式:
在⼀⾏中输出对应序列倒数第 N 个字符串。题⽬保证这个字符串是存在的。
输⼊样例:
3 7417
输出样例:
pat
这个其实类似于给出⼀个整数 x,再给出⼀个数 n ,然后求出 x ⼀直往前减 1 ,直到减了 n - 1次的值(因为 x 本⾝是倒数第⼀个数,所以只需减 n - 1 次)。
对于字符串也是⼀样的。⽐如:zzz 的前⼀个字符串就是 zzy ,zza 的前⼀个字符串就是 zyz 。所以我们只需要对⼀个字符串模拟整数的⾃减就可以了。下⾯是 AC 代码:
/**
* ⽤字符串模拟整数的⾃减过程
*/
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
string str;
// 构造最末尾的字符串
for (int i = 0; i < n; i++) {
str.append(1, 'z');
}
int size = str.length();
// 减 m-1 次,因为 str 是倒数第⼀个字符串
for (int i = 0; i < m-1; i++) {
for (int j = size-1; j >= 0; --j) {
if (str[j] > 'a') {
str[j]--;
// 将当前字符后⾯的所有字符置为 'z',例:zza 的前⼀个字符串为 zyz
for (int t = j+1; t < size; t++) {
str[t] = 'z';
}
break;
}
}
}
cout << str << endl;
return0;
}
L1-3 打折(5 分)
去商场淘打折商品时,计算打折以后的价钱是件颇费脑⼦的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% =¥691.60。本题就请你写个程序替客户计算折扣价。
输⼊格式:
输⼊在⼀⾏中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。
在⼀⾏中输出商品的折扣价,保留⼩数点后 2 位。
输⼊样例:
988 7
输出样例:
691.60
这个题⽬没啥讲的,注意下把第⼆个整数转换成浮点数就好了,因为 整数 / 整数 = 整数
#include <iostream>
using namespace std;
int main() {
int n;
double m;
cin >> n >> m;
printf("%.2lf", n*m/10);
return0;
}
L1-4 2018我们要赢(5 分)
2018年天梯赛的注册邀请码是“2018wmyy”,意思就是“2018我们要赢”。本题就请你⽤汉语拼⾳输出这句话。
输⼊格式:
本题没有输⼊。
输出格式:
在第⼀⾏中输出:“2018”;第⼆⾏中输出:“wo3 men2 yao4 ying2 !”。
输⼊样例:
本题没有输⼊。
输出样例:
2018
wo3men2yao4ying2!
代码:
#include <iostream>
using namespace std;
int main() {
cout << "2018\nwo3 men2 yao4 ying2 !" << endl;
}
L1-5 电⼦汪(10 分)
据说汪星⼈的智商能达到⼈类 4 岁⼉童的⽔平,更有些聪明汪会做加法计算。⽐如你在地上放两堆⼩球,分别有 1 只球和 2 只球,聪明汪就会⽤“汪!汪!汪!”表⽰ 1 加 2 的结果是 3。
本题要求你为电⼦宠物汪做⼀个模拟程序,根据电⼦眼识别出的两堆⼩球的个数,计算出和,并且⽤汪星⼈的叫声给出答案。
输⼊格式:
输⼊在⼀⾏中给出两个 [1, 9] 区间内的正整数 A 和 B,⽤空格分隔。
输出格式:
在⼀⾏中输出 A + B 个Wang!。
输⼊样例:
21
输出样例:
Wang!Wang!Wang!
这个也没有什么讲的,代码:
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
a += b;
for (int i = 0; i < a; i++) {
cout << "Wang!";
}
return0;
}
L1-6 福到了(15 分)
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这⾥要处理的每个汉字是由⼀个 N × N 的⽹格组成的,⽹格中的元素或者为字符 @ 或者为空格。⽽倒过来的汉字所⽤的字符由裁判指定。
输⼊格式:
输⼊在第⼀⾏中给出倒过来的汉字所⽤的字符、以及⽹格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N ⾏,每⾏给出N 个字符,或者为 @ 或者为空格。
输出格式:
输出倒置的⽹格,如样例所⽰。但是,如果这个字正过来倒过去是⼀样的,就先输出bu yong dao le,然后再⽤输⼊指定的字符将其输出。
发布评论