• 刷题之莲子的软件工程学和机械动力学以及物理热力学


    目录

    1、莲子的软件工程学

    1)题目

     2)题目解析

     3)代码

    2、莲子的机械动力学

     2)题目解析

     3)代码

    3、莲子的物理热力学

    1)、题目

     2)题目解析

    3)代码

    1、莲子的软件工程学

    1)题目

    题目背景

    在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。

    对于一名理科生来说,各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么一些函数。

    输入格式

    • 共一行两个整数 a,b。

    输出格式

    • 共一行一个整数fun(a,b) 的值。

    说明/提示

    对于全部数据,保证 a,b 在 32 位有符号整型范围内,并且 b ≠0。

     2)题目解析

    题目意思就是由b来确定a的正负号,并输出其结果,a,b是32 位有符号整型的数,其范围是 -2^31~2^31-1。因此我们应该使用long作为a,b的基本数据类型。

     3)代码

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main1(String[] args) {
    4. Scanner sc=new Scanner(System.in);
    5. long a=sc.nextInt();
    6. long b=sc.nextInt();
    7. if (b>0){
    8. System.out.println(Math.abs(a));
    9. }else if (b<0){
    10. System.out.println(Math.abs(a)*-1);
    11. }
    12. }
    13. }

    2、莲子的机械动力学

    题目描述

    题目背景的问题可以转化为如下描述:

    给定两个长度分别为 n,m的整数 a,b,计算它们的和。

    但是要注意的是,这里的 a,b 采用了某种特殊的进制表示法。最终的结果也会采用该种表示法。具体而言,从低位往高位数起,第 ii 位采用的是 i+1进制。换言之,相较于十进制下每一位的「逢 10进 1」,该种进制下第 i 位是「逢 i+1 进 1」。

    下图所示,左边是十进制的竖式加法;右边是这种特殊进制的竖式加法。图中的红色加号表示上一位发生了进位。

    输入格式

    • 第一行有两个整数n,m,分别表示 aa 和 bb 的位数。
    • 第二行有 n个整数,中间用空格隔开,从高到低位描述 a 的每个数码。
    • 第三行有 m 个整数,中间用空格隔开,从高到低位描述 b 的每个数码。

    输出格式

    • 输出有若干个整数,从高到低位输出 a+b 在这种特殊表示法下的结果。

     

    说明/提示

    对于全部数据,保证 1≤n,m≤2×10^5,从低位往高位数起有 ai​∈[0,i],bi∈[0,i]。请使用 Java 或 Python 语言作答的选手注意输入输出时的效率。

     2)题目解析

     通读题目我们可以知道低位往高位数进制从2逐1递增,也就是最低位数是二进制的,要满2进1;倒数第二位数是三进制的,要满3进1;倒数第三位数是四进制的,要满4进1······第一位数是a,b最长数的 长度+1进制

    需要特别小心的是第一位数是否要再进一位。

     3)代码

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) {
    4. Scanner sc=new Scanner(System.in);
    5. int a=sc.nextInt();
    6. int b=sc.nextInt();
    7. //创建相应长度的数组
    8. int []ar1=new int[a];
    9. int []ar2=new int[b];
    10. for (int i=0;i
    11. ar1[i]=sc.nextInt();
    12. }
    13. for (int i=0;i
    14. ar2[i]=sc.nextInt();
    15. }
    16. //默认ar1是最长数的数组,寻找出a,b的最大值,并交换
    17. int max=Math.max(a,b);
    18. int []arr;
    19. if (max==b){
    20. arr=ar1;
    21. ar1=ar2;
    22. ar2=arr;
    23. }
    24. int count=0;//判断是否需要进位
    25. int t=2; //当前的进制位
    26. //从后面开始循环,其结果存入ar1数组中
    27. for (int i=1;i<=ar1.length;i++){
    28. int x=ar1[ar1.length-i];
    29. if (i<=ar2.length){ //判断长度更小的数组是否存在越界
    30. ar1[ar1.length-i]=(x+ar2[ar2.length-i]+count)%t;
    31. count=(x+ar2[ar2.length-i]+count)/t;
    32. }else {
    33. ar1[ar1.length-i]=(x+count)%t;
    34. count=(x+count)/t;
    35. }
    36. t++;
    37. }
    38. //判断第一位数是否超出该进制的范围,并输出
    39. if (count!=0){
    40. System.out.print(count+" ");
    41. }
    42. for (int j=0;j1;j++){
    43. System.out.print(ar1[j]+" ");
    44. }
    45. System.out.print(ar1[ar1.length-1]);
    46. }
    47. }

    3、莲子的物理热力学

    1)、题目

    题目背景

    莲子正在研究分子的运动。

    每个分子都有一个速度,约定正方向为正,负方向为负。分子的数量极多,速度又并不一致,看上去杂乱无章。于是莲子希望调整部分分子的速度,使得最终分子们看上去整齐。

     

    输入格式

    • 第一行有两个正整数 n,m,分别表示序列的长度和你最多可以进行的操作次数。
    • 第二行有 nn 个整数 a,描述给定的序列。

    输出格式

    • 输出共一行一个整数,表示最优策略下能得到的最小极差。

     

     2)题目解析

     分别输入两个数n和m,分别表示n个数和可以操作m次,操作是指定最小值变最大值或者最大值变最小值。然后计算n个数中最大值和最小值的差,即“最小化最终序列的极差”

    我使用的方法是枚举法,分别从最小值开始,和最大值开始,分别求出最小的极差。

    过程如下图,从最大值的过程也是类似。

     

    3)代码

    1. import java.util.Arrays;
    2. import java.util.Scanner;
    3. public class Main {
    4. public static void main(String[] args) {
    5. Scanner sc=new Scanner(System.in);
    6. int n=sc.nextInt();
    7. int m=sc.nextInt();
    8. long []arr=new long[n];
    9. for (int i=0;i
    10. arr[i]=sc.nextInt();
    11. }
    12. //防止该输入的数组并非是从小到大排序
    13. Arrays.sort(arr);
    14. long min=Integer.MAX_VALUE;
    15. //m>=n,所以数都会被操作一遍,即都是同一个数,此时min=0
    16. if(m>=n) {
    17. min=0;
    18. }else if (m==0)
    19. //m=0,min=arr[arr.length-1]-arr[0];
    20. min=arr[arr.length-1]-arr[0];
    21. else{
    22. int i=0;
    23. long l,r;
    24. //从左边,最小值开始
    25. while (i!=m){
    26. l=arr[i];
    27. int x=m-2*i;
    28. if (x>0)
    29. r=arr[arr.length-1-x];
    30. else
    31. r=arr[arr.length-1];
    32. //判断r-l是否大于0,处理r跑到l左边的情况,
    33. //但是因为最开始判断了m>=n的情况,因此可以不用判断
    34. // if (r-l<0)
    35. // continue
    36. min=Math.min(min,r-l);
    37. i++;
    38. }
    39. //从右边,最大值开始
    40. i=0;
    41. while (i!=m){
    42. r=arr[arr.length-1-i];
    43. int x=m-2*i;
    44. if (x>0)
    45. l=arr[x];
    46. else
    47. l=arr[0];
    48. //判断r-l是否大于0,处理r跑到l左边的情况,
    49. //但是因为最开始判断了m>=n的情况,因此可以不用判断
    50. // if (r-l<0)
    51. // continue;
    52. min=Math.min(min,r-l);
    53. i++;
    54. }
    55. }
    56. System.out.println(min);
    57. }
    58. }

    感兴趣的也可以看看官方的题解:

    【A组 —— 题目+题解】 
    第五届传智杯-初赛【A组-题解】_h阿泉有个梦的博客-CSDN博客 
    【B组 —— 题目+题解】 
    第五届传智杯-初赛【B组-题解】_h阿泉有个梦的博客-CSDN博客 
    【C组 —— 题目+题解】 
    第五届传智杯-初赛【C组-题解】_h阿泉有个梦的博客-CSDN博客

             👍👍👍看完了点个赞吧👍👍👍

     

  • 相关阅读:
    HC32L110 在 Ubuntu 下使用 J-Link 烧录
    MyBatis配置文件(mybatis-config.xml)
    Linux 内核构建
    【笔记】Nginx(5)七层负载均衡
    Matlab之显示绘制曲线轨迹命令drawnow
    机器人动力学模型与MATLAB仿真
    JVM参数设置
    LeetCode 946 验证栈序列[栈 模拟] HERODING的LeetCode之路
    大话STL第四期——list双向链表
    Selenium自动访问Firefox和Chrome并实现搜索截图
  • 原文地址:https://blog.csdn.net/m0_63951142/article/details/128057944