PAT(B) 1070 结绳(Java)
题目描述
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。
输入格式
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (2≤N≤104);第 2 行给出 N 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过104。
输出格式
在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。
输入样例
8
10 15 12 3 4 13 1 15
输出样例
14
分析💬
无力吐槽此题。
反正我的阅读理解也就那样了。我觉得他并没有说所有绳子都要用啊。不知道为什么要这样做。
所以直接搜了一篇PTA(Basic Level)1070 结绳 (25 point(s))『YorigamiShion』,也懒得做过多解释了。
Java 代码
/*********************************************************************************
Submit Time Status Score Problem Compiler Run Time User
8/27/2019, 21:57:26 Accepted 25 1070 Java (openjdk) 122 ms wowpH
*********************************************************************************/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
private static BufferedReader input;
private static int ropeNumber;// 绳子数量
private static int[] ropeLength;
private static void initBufferedReader() {
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
input = new BufferedReader(isr);
}
private static void inputData() {
String str = getLine();
ropeNumber = Integer.parseInt(str);
ropeLength = new int[ropeNumber];
str = getLine();
String[] arr = str.split(" ");
for (int i = 0; i < ropeNumber; ++i) {
ropeLength[i] = Integer.parseInt(arr[i]);
}
}
private static String getLine() {
String str = "";
try {
str = input.readLine();
} catch (IOException e) {
}
return str;
}
private static void sortRope() {
Arrays.sort(ropeLength);
}
private static int getMaxLength() {
int length = ropeLength[0];
for (int i = 1; i < ropeNumber; ++i) {
length = (length + ropeLength[i]) / 2;
}
return length;
}
public static void main(String[] args) {
initBufferedReader();
inputData();
sortRope();
int maxLength = getMaxLength();
System.out.println(maxLength);
}
}