201907训练赛1题解

训练赛1题解

  • 问题 A: 字典序排序
  • 问题 B: 倒咖啡
  • 问题 C: 挖金矿
  • 问题 D: 钻石组的a+b
  • 问题 E: Who took the most Scholarships
  • 问题 F: 建大厦
  • 问题 G: 最小花费
  • 问题 H: 合根植物
  • 问题 I: 最大的数

问题 A: 字典序排序

时间限制: 1 Sec 内存限制: 128 MB
题目描述
钱老师今天在录学生成绩,但是学校系统录入成绩的时候是根据姓名的字典序排序的,钱老师觉得排姓名字典序太麻烦了,所以想找你帮他写个程序来解决。
输入
第一排输入一个数N,代表录入N个学生的姓名。

接下来是N排,每排一个字符串代表学生的名字(每个字的首字母大写)。

输出
输出N排,代表字典序排序后的结果。
样例输入
5
WuYanZu
PengYuYan
LuHan
GuanXiaoTong
LiYiFeng
样例输出
GuanXiaoTong
LiYiFeng
LuHan
PengYuYan
WuYanZu
注:(字符串处理、字典序排序),字典序排序即将多个字符串的同一位置的字符按照26个字母的顺序进行比对,从每个字串首字符开始比较,若相同则继续比较,按从小到大顺序排列。
(第一种直接采用sort排序,sort除了简便的默认升序排序,也可自定义排序方法和排序对象)
201907训练赛1题解_第1张图片201907训练赛1题解_第2张图片

问题 B: 倒咖啡

时间限制: 1 Sec 内存限制: 128 MB
题目描述
现有两只杯子A, B,没有标明刻度,不过我们知道A, B的容量分别为是VA, VB。
请问是否可以使用A, B两个杯子,用尽你可以想到的方法恰好将B中倒入容量为V的咖啡。
Input
输入
多组测试数据,
每一行输入V, VA, VB。 (1<= VA<=VB<= 1000,1<=V<=VB),
假设倒的过程中不会溅出,
假设有足够的咖啡供你使用,
A,B中的咖啡可以互相倒入。

输出
如果可以,输出"YES",否则输出"NO"
样例输入
15 3 20
样例输出
YES
注:(数论),根据题意可得出辗转相除法的过程,即求最大公约数
201907训练赛1题解_第3张图片

问题 C: 挖金矿

时间限制: 1 Sec 内存限制: 128 MB
题目描述
有一天国王的部下发现了m座矿山,里面有许多金矿。但是,擅长开采金矿的工人只有n个,并且每座矿山需要的矿工和开采的矿石数量不一样。每座矿山可以开采金矿x吨,需要y名矿工。请问国王以最优的分配方式分配这n个人,最多可以开采多少吨矿石。
输入
多组数据输入,第一行两个数 为矿山数m和矿工数n。接下来是m行,每行两个数,分别代表每座矿山需要的矿工数y和可以开采出的矿石x吨。 (1 输出
多组数据输出,输出每组数据最多能开采多少吨矿石。
样例输入
3 10
3 4
4 5
5 6
4 15
4 5
5 6
6 7
7 8
样例输出
11
18
注:(动态规划,背包),该题是经典的01背包,还有多重背包,完全背包,自行详细了解。对于每座矿石只存在采和不采两种情况,列出动态方程dp(i,j)=dp(i-1,j)[当j个人不满足则继承上一种状态]或者dp(i,j)=max((dp(i-1,j-w[i])+v(i)),dp(i-1,j))[满足条件考虑最优],加深理解可打表(i座矿山有j个人最大的价值):
201907训练赛1题解_第4张图片
201907训练赛1题解_第5张图片

问题 D: 钻石组的a+b

时间限制: 1 Sec 内存限制: 128 MB
题目描述
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.

A,B must be positive.

输入
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
输出
For each test case, you should output two lines. The first line is “Case #:”, # means the number of the test case. The second line is the an equation “A + B = Sum”, Sum means the result of A + B. Note there are some spaces int the equation.
样例输入
2
1 2
112233445566778899 998877665544332211
样例输出
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
注:(大数)数太大需做特殊处理,转化成数组,代码看看就能懂,就不详细解释了 。(大数相减、相乘都是同样道理)
201907训练赛1题解_第6张图片
201907训练赛1题解_第7张图片

问题 E: Who took the most Scholarships

时间限制: 1 Sec 内存限制: 128 MB
题目描述
The practice of CDUTCM is to grant scholarships after each semester’s final examination. There are five kinds of scholarships, and the conditions are different.

  1. academician scholarship, 8000 yuan per person, the end of the term average higher than 80 points (>80), and in this semester to publish 1 or more than 1 papers can be obtained;

  2. 54 scholarship, 4000 yuan per person, average final score higher than 85 points (>85) at the end of the semester, and the students whose class appraisal scores are above 80 points (>80) can be obtained.

  3. the best performance award is 2000 yuan per person, and the average final score is higher than 90 points (>90).

  4. scholarship in the west, 1000 yuan per person, and the average student achievement in the western part of the province is higher than 85 points (>85).

  5. the class contribution award, 850 yuan per person, and the class appraisal score higher than 80 points (>80) can be obtained by student leaders.

As long as they meet the requirements, they can be awarded. There are no restrictions on the number of awards per scholarship, and each student can also get many scholarships at the same time. For example, Yao Lin’s final average score is 87 points, class review results are 82 points, and he is still a student cadre, then he can win both the 54 scholarship and the class contribution award, the total scholarships is 4850 yuan.

Now give some students’ relevant data, please calculate which students get the highest total scholarships(assuming that some students can meet the requirements of scholarship).

输入
The first line of input is an integer N (1 < = N < 100), indicating the total number of students. The next N line is a student’s data, from left to right is the name, the end of the term average, class evaluation, whether the student cadre, whether the western province students, and the number of papers published. The name is a string of no more than 20 of the length and write of English letters (without space); the final average and class comments are an integer between 0 and 100 (including 0 and 100); whether the student leader and the western province students are represented in one character respectively, Y is, N is not; published. The number of papers is from 0 to 10 integers (including 0 and 10). Each two adjacent data items are separated by one space.
输出
The output includes three rows, the first line is the name of the student who gets the most scholarships, and the second row is the total number of scholarships awarded by the student. If two or two or more students get the most scholarships, the first student’s name will appear in the input document. The third line is the total number of scholarships awarded to the N students.
样例输入
4
WangYue 87 82 Y N 0
LiChangLin 88 78 N Y 1
ZhangFan 92 88 N N 0
NiuBi 83 87 Y N 1
样例输出
LiChangLin
9000
28700
注:(模拟)这道题就是各种条件,就模拟条件算就对了,个人推荐用结构体做,逻辑清晰,注意一下最后的比较
201907训练赛1题解_第8张图片
201907训练赛1题解_第9张图片

问题 F: 建大厦

时间限制: 1 Sec 内存限制: 128 MB
题目描述
ACM队员集训十分辛苦,奈何环境不是很好。由于实验室123后面在建大厦,所以很吵,xxx实在是忍不住了,站起来冲天大喊道:“假设后面这座大厦的高度不一,大厦可以看做n块宽度为1高度可以为正无穷的砖头组成,第i块砖头的高度为hi。最开始没有任何砖头,接下来每次搬砖,可以选一段连续区间[L,R],然后将第L块到第R块之间(含第L块和第R块)所有砖头的高度分别增加1。”就这样,一道新的题目就诞生了。显然,1023号大佬很快就想到了建造大厦的最佳策略,使得建造所需的操作数最少。但是他不勤于动手,所以想找你帮忙实现这个策略,并求出最少的操作次数。
输入
输入包含两行,第一行包含一个整数 n,表示大厦的宽度。

第二行包含 n 个整数,第i个整数为hi。

输出
仅一行,即建造所需的最少操作数。
样例输入
5
2 3 4 1 2
样例输出
5
提示
模拟,贪心
注:(模拟),最初砖头高度为0,按操作每次使连续区间的砖头高度增加1,求满足条件的最小操作次数,模拟加的过程,很快发现规律
201907训练赛1题解_第10张图片

问题 G: 最小花费

时间限制: 1 Sec 内存限制: 128 MB
题目描述
在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。

输入

第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。

以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100)。

最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。

1<=n<=2000,m<=100000

输出
输出A使得B到账100元最少需要的总费用。精确到小数点后8位。

样例输入
3 3
1 2 1
2 3 2
1 3 3
1 3
样例输出
103.07153164
提示
spfa / dijkstra
注:(有时题目很简单,给出的样例也比较小,要注意一下它的数值范围,有可能后台数据很强大,一不小心就超时,那就要找适合的算法,优化算法)该题求最小花费,就是找到最短最优的路径,dijkstra是一种求最短路径的算法,自己了解吧,网上教程很多,小L就直接粘代码了
201907训练赛1题解_第11张图片
201907训练赛1题解_第12张图片

问题 H: 合根植物

时间限制: 1 Sec 内存限制: 128 MB
题目描述
w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
输入
第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1 接下来一行,一个整数k,表示下面还有k行数据(0 接下来k行,第行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。

格子的编号一行一行,从上到下,从左到右编号。
比如:5 * 4 的小格子,编号:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
输出
根据情况输出根的数目
样例输入
5 4
16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17
样例输出
5
提示
注:(并查集)不知道并查集之前是不是想不通自己错哪儿了,反正我是haha。了解了并查集之后就觉得逻辑清晰多了 ,用来处理一些合并和查询的问题,分为三步:(1)初始化;把每个点的根节点初始化为其自己;(2)查找;判断两个元素的根节点是否相同;(3)合并;根据查找的结果,根节点不同,则合并为同一个根节点。

201907训练赛1题解_第13张图片

问题 I: 最大的数

时间限制: 1 Sec 内存限制: 128 MB
提交: 11 解决: 5
[提交][状态][讨论版][命题人:201644901023][Edit] [TestData]
题目描述
有一天,聪明的小c正在解决一个难题,但是这个游戏太困难了,让小c一时之间难以解决,他突然之间想到了正在ACM团队里面认真学习的你,想让你发挥你的聪明才智帮他完成这个困难的题目。题目是在一个ab的矩阵中(1b<=22)每一个方格里面有着1~9的任意一个数字或者#(代表障碍),你可以从矩阵中的任意一个格子出发(当然不能从#里出发),然后每次沿着上下左右之一的方向走一格,但不能走到障碍格中,也不能重复经过一个数字格,然后把所走过的数(如图可以构成9784,4879等)连接起来,问你能够得到的最大整数是多少?

201907训练赛1题解_第14张图片

输入
有多组输入数据,第一行输入a,b代表行列,然后接下来a行每行输入b个数字或者#,含义如上面描述,当a,b同时为0时程序结束。

输出
输出最大的数。
样例输入
3 7
##9784#
##123##
##45###​
样例输出
791452384
注:(dfs)关于深搜之前水木林学长讲的很详细了,也就是递归,最重要的两步是(1)出口,(2)主(下一步怎么走)这道题要处理一下入口,每次递归处理当前获得的数。
201907训练赛1题解_第15张图片

你可能感兴趣的:(ACM,ACM,算法,题解)