• 荣耀笔试(8.16)


    第一题:给定2000年1月1日是星期六,输入是年份,月份,周数和一周的第几天,输出日期。

    例:输入:

    2022 08 3 2

    输出:

    2022-08-16

    代码如下:

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) {
    4. Scanner sc = new Scanner(System.in);
    5. String[] s = sc.nextLine().split(" ");
    6. int year = Integer.parseInt(s[0]);
    7. int month = Integer.parseInt(s[1]);
    8. int week = Integer.parseInt(s[2]);
    9. int day = Integer.parseInt(s[3]);
    10. int tmp = 0;
    11. for(int i=2000;i
    12. if(isRun(i)){
    13. tmp += 366 % 7;
    14. }else{
    15. tmp += 365 % 7;
    16. }
    17. }
    18. int[] count = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    19. if(isRun(year)){
    20. count[1] = 29;
    21. }
    22. for(int i=0;i1;i++){
    23. tmp+= count[i];
    24. }
    25. tmp = tmp % 7;
    26. int res = 0;
    27. int[] xinqi = {6, 7, 1, 2, 3, 4, 5};
    28. tmp = xinqi[tmp]; //表示1号是星期几
    29. System.out.println("1号: " + tmp);
    30. int w = week;
    31. //System.out.println("....");
    32. if(w == 1){
    33. if(tmp > day){
    34. System.out.println(0);
    35. return;
    36. }else{
    37. res = day - tmp + 1;
    38. if(month < 10){
    39. System.out.println(year + "-0"+ month + "-0" + res);
    40. return;
    41. }else{
    42. System.out.println(year + "-"+ month + "-0" + res);
    43. return;
    44. }
    45. }
    46. }else{
    47. res += 7 - tmp + 1;
    48. w--;
    49. while(w != 1){
    50. res += 7;
    51. w--;
    52. }
    53. res += day;
    54. if(res > count[month]){
    55. System.out.println(0);
    56. return;
    57. }
    58. if(month < 10){
    59. if(res < 10){
    60. System.out.println(year + "-0"+ month + "-0" + res);
    61. return;
    62. }
    63. System.out.println(year + "-0"+ month + "-" + res);
    64. return;
    65. }else{
    66. if(res < 10){
    67. System.out.println(year + "-"+ month + "-0" + res);
    68. return;
    69. }
    70. System.out.println(year + "-"+ month + "-" + res);
    71. return;
    72. }
    73. //System.out.println(year + "-"+ month + "-" + res);
    74. }
    75. }
    76. public static boolean isRun(int year){
    77. if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
    78. return true;
    79. }
    80. return false;
    81. }
    82. }

    第二题与牛客上的一题很类似,做项目的最大收益问题

     代码如下

    1. //贪心算法,按照成本先将所有项目升序排列,然后把能做的项目拿出来按照利润降序排列,
    2. // 选择利润最大的做,周而复始直到无项目可做。用一个大根堆和一个小根堆来完成排序操作。
    3. public static void main(String[] args) {
    4. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    5. String[] params = br.readLine().split(" ");
    6. PriorityQueue<int[]> minHeap = new PriorityQueue<>((program1, program2)->program1[0] - program2[0]);
    7. PriorityQueue<int[]> maxHeap = new PriorityQueue<>((program1, program2)->program2[1] - program1[1]);
    8. int n = Integer.parseInt(params[0]), k = Integer.parseInt(params[2]);
    9. long w = Long.parseLong(params[1]);
    10. int[][] programs = new int[n][2];
    11. params = br.readLine().split(" ");
    12. for(int i=0;i0] = Integer.parseInt(params[i]);
    13. params = br.readLine().split(" ");
    14. for(int i=0;i
    15. programs[i][1] = Integer.parseInt(params[i]);
    16. minHeap.offer(programs[i]);
    17. }
    18. //只能做k个项目
    19. for(int i=0;i
    20. while(!minHeap.isEmpty() && w >= minHeap.peek()[0]){
    21. maxHeap.offer(minHeap.poll());
    22. }
    23. if(maxHeap.isEmpty())
    24. break; //没有可做的项目了
    25. else
    26. w += maxHeap.poll()[1]; //可以做的项目选利润最大的
    27. }
    28. System.out.println(w);
    29. }

     第三题:超级左旋

    小立是一个乒乓球手,他的“超级左旋非常强大。
    小立给自己制定了一份n天的训练计划来锻炼〝超级左旋”,并旦他每天会记录下失误的次数。
    每天的训练结束后,小立都会进行反思自己是否退步。
    之前每有一天的失误次数比今天的多,都会使他的能力值-1。
    之前每有一天的失误次数比今天的少,都会使他的能力值+1。
    之前每有-一天的失误次数与今天相同,不会影响他的能力值。
    每天的能力值柠继承至下一天。初始能力值为0。
    因为第—天没有之前的失误次数作为对照,所以第一天结束后,能力值不会改变。
    求小立能力值最高时为多少,以及训练结束后小立的最終能力值为多少。

    输入要求

    输入一个数字T,表示有T组测试数据。
    对于每组测试数据。第一行输入一个n,表示小立训练的天数。
    第二行输入n个数字,ai(1 (1 <= n, ai<=100000)

    输出要求

    对于每组测试数据,输出两个数字表示小立能力值最高为多少,以及训练结束后小立的最终能力值为多少

    示例

    输入

    1. 2
    2. 3
    3. 1 3 2
    4. 3
    5. 2 1 3

    输出

    1. 1 1
    2. 1 1

    代码如下:

    1. public static void main(String[] args) {
    2. Scanner sc = new Scanner(System.in);
    3. int t = sc.nextInt();
    4. sc.nextLine();
    5. List list = new ArrayList<>();
    6. int maxScore = 0;
    7. for(int i=0;i
    8. int days = sc.nextInt();
    9. sc.nextLine();
    10. String[] fault = sc.nextLine().split(" ");
    11. Integer[] faultNum = new Integer[fault.length];
    12. for(int j=0;j< fault.length;j++){
    13. faultNum[j] = Integer.parseInt(fault[j]);
    14. }
    15. list.add(faultNum);
    16. }
    17. for(int i=0;i
    18. Integer[] temp = list.get(i);
    19. int[] energy = new int[temp.length];
    20. for(int j=1;j
    21. int high = 0;
    22. int low = 0;
    23. for(int k=1;k<=j;k++){
    24. if(temp[k-1] > temp[j]){
    25. low++;
    26. }else if(temp[k-1] < temp[j]){
    27. high++;
    28. }
    29. }
    30. energy[j] = energy[j-1] - low + high;
    31. if(energy[j] > maxScore){
    32. maxScore = energy[j];
    33. }
    34. }
    35. System.out.println(maxScore + " " + energy[energy.length - 1]);
    36. }
    37. }

    不知道为啥我用暴力只过了20%,超时了

  • 相关阅读:
    这些负载均衡都解决哪些问题?服务、网关、NGINX
    VR数字展厅在企业中应用的优势有哪些?
    CSS小计
    数据结构(c语言版) 树的遍历
    Master PDF Editor v5.9.70便携版
    《OpenDRIVE1.6规格文档》2
    Java-BigInteger类(详解)
    node.js --- npm模块 以及 项目配置文件
    【CF1693C】Keshi in Search of AmShZ(类dijkstra)
    Linux脚本shell中将Windos格式字符转换为unix
  • 原文地址:https://blog.csdn.net/qq_38235017/article/details/126374194