笔试时间:2023年04月01日 春招实习 第一题 题目:算数 小美在数学课上学会了加减乘除,现在她想多进行一些算数训练来加强自己的计算能力。为了不重复出题,她想出一个好方法。她先写下了一排n个数(n≥2),依次用加号连接。举例来说,小美可能写下了如下的式子1+4+7+4+2+3+1共7个数以及6个加号。接着小美以一种全新的方式进行出题:她每次选择一个加号,将它改变成加减乘除中的一个(虽然很奇怪,但小美认为加号也可以被改成加号,尽管不会产生任何影响),然后计算整个式子的结果。值得注意的是,小美认为每次操作不对后续操作产生影响,详见样例解释。小美认真做了很多次算数训练,现在她想让作为她好朋友的你帮她用程序计算一次,方便她核对答案。 输入描述 第一行一个整数n,含义见题面。 接下来一行n个整数a1,a2,..,an,依次表示小美初始写下的连加算式中的每一个数。 接下来一个整数m,表示小美做了m次算数训练 接下来2m个以空格分开数字或符号 t1,o1, t2,o2, ... tm,om,其中ti为数字,oi是'+','-','*','/'(即加减乘除符号,不含引号)中的一个符号,表示第 i 次操作选定了第ti个加号,将其改变为了oi。 对于所有的的数据,2≤N≤50000,1≤M≤50000,1≤ai≤500,1≤ti<N,oi∈{+,-,*,/} 输出描述 输出一行m个整数,分别表示每次操作的答案,结果四舍五入到一位小数。 样例输入 5 1 2 4 2 5 3 1 - 2 * 4 / 样例输出 10.0 16.0 7.4 解释: 第一次操作后算数式为1-2+4+2+5 = 10.0 第二次操作后算数式为1+2*4+2+5 = 16.0 第三次操作后算数式为1+2+4+2/5 = 7.4 值得注意的是,每次操作都认为对初始的全加号式子(此处为1+2+4+2+5)进行操作,操作之间互不影响。 参考题解 按照题意模拟。 C++:[此代码未进行大量数据的测试,仅供参考] #include <iostream>#include <vector>#include <iomanip>using namespace std;double perform_operation(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return static_cast<double>(a) / b; default: return 0; }}int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; ++i) { cin >> nums[i]; } // 计算原始算式的结果 int original_sum = 0; for (int i = 0; i < n; ++i) { original_sum += nums[i]; } int m; cin >> m; vector<int> t(m); vector<char> op(m); for (int i = 0; i < m; ++i) { cin >> t[i] >> op[i]; } cout << fixed << setprecision(1); for (int i = 0; i < m; ++i) { int index = t[i] - 1; char operation = op[i]; double result = original_sum - nums[index] - nums[index + 1]; result += perform_operation(nums[index], nums[index + 1], operation); cout << result << " "; } return 0;} Java:[此代码未进行大量数据的测试,仅供参考] import java.util.Scanner;public class Main { public static double performOperation(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return (double) a / b; default: return 0.0; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; ++i) { nums[i] = scanner.nextInt(); } // 计算原始算式的结果 int originalSum = 0; for (int i = 0; i < n; ++i) { originalSum += nums[i]; } int m = scanner.nextInt(); int[] t = new int[m]; char[] op = new char[m]; for (int i = 0; i < m; ++i) { t[i] = scanner.nextInt(); op[i] = scanner.next().charAt(0); } for (int i = 0; i < m; ++i) { int index = t[i] - 1; char operation = op[i]; double result = originalSum - nums[index] - nums[index + 1]; result += performOperation(nums[index], nums[index + 1], operation); System.out.printf("%.1f ", result); } }} Python:[此代码未进行大量数据的测试,仅供参考] def perform_operation(a, b, op): if op == '+': return a + b elif op == '-': return a - b elif op == '*': return a * b elif op == '/': return float(a) / b else: return 0.0def main(): n = int(input()) nums = list(map(int, input().split())) # 计算原始算式的结果 original_sum = sum(nums) m = int(input()) t = [] op = [] for _ in range(m): ti, opi = input().split() t.append(int(ti)) op.append(opi) for i in range(m): index = t[i] - 1 operation = op[i] result = original_sum - nums[index] - nums[index + 1] result += perform_operation(nums[index], nums[index + 1], operation) print("{:.1f}".format(result), end=" ")if __name__ == "__main__": main() 第二题 题目:整理 小美正在整理桌子上的一排装饰品。小美对待装饰品摆放方式的审美角度很奇特,她认为高度相差比较大的装饰品放在相邻位置会很难看,她想对这一排装饰品进行整理,可以交换任意两个装饰品的位置任意多次。假设当前从左到右n个装饰品的高度分别为h1,h2,...,hn,那么当前一排装饰品的丑陋值为,其中|x|为x的绝对值。小美想最小化她的装饰品的丑陋值,请你帮她排一下顺序。形式化地来讲,有一长为n的序列a1,a2,...,an,你可以任意次数地进行交换,每次交换都可以选择任意两个不同的数i,j,交换ai,aj的位置。经过若干次交换后,序列变为h1,h2,...,hn,其丑陋值为,你需要找出一种交换方式,使得最终序列{hn}的丑陋值最小化。你不需要输出具体交换方式,只需要输出最终的{hn}序列的丑陋值即可。 输入描述 第一行一个整数n,表示小美的装饰品数量。 接下来一行n个整数a1,a2,...,an,依次表示从左到右n个装饰品的高度。 对于所有的数据:2≤N≤50000,0≤ai≤10^9。 输出描述 输出第一行一个数,为最优方案的最小丑陋值。 样例输入 3 3 1 2 样例输出 2 提示: 我们可以将3和1交换,得到1 3 2然后再将2和3交换,得到1 2 3可以证明,此时有最小丑陋值|1-2|+|2-3|=2 参考题解 C++:[此代码未进行大量数据的测试,仅供参考] #include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } sort(a.begin(), a.end()); int res = 0; for (int i = 0; i < n - 1; ++i) { res += a[i + 1] - a[i]; } cout << res << endl; return 0;} Java:[此代码未进行大量数据的测试,仅供参考] import java.util.Arrays;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; ++i) { a[i] = scanner.nextInt(); } Arrays.sort(a); int res = 0; for (int i = 0; i < n - 1; ++i) { res += a[