笔试时间: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[
点赞 1
评论 0
全部评论

相关推荐

被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务