第一题:给定2000年1月1日是星期六,输入是年份,月份,周数和一周的第几天,输出日期。
例:输入:
2022 08 3 2
输出:
2022-08-16
代码如下:
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] s = sc.nextLine().split(" ");int year = Integer.parseInt(s[0]);int month = Integer.parseInt(s[1]);int week = Integer.parseInt(s[2]);int day = Integer.parseInt(s[3]);int tmp = 0;for(int i=2000;i<year;i++){if(isRun(i)){tmp += 366 % 7;}else{tmp += 365 % 7;}}int[] count = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(isRun(year)){count[1] = 29;}for(int i=0;i<month-1;i++){tmp+= count[i];}tmp = tmp % 7;int res = 0;int[] xinqi = {6, 7, 1, 2, 3, 4, 5};tmp = xinqi[tmp]; //表示1号是星期几System.out.println("1号: " + tmp);int w = week;//System.out.println("....");if(w == 1){if(tmp > day){System.out.println(0);return;}else{res = day - tmp + 1;if(month < 10){System.out.println(year + "-0"+ month + "-0" + res);return;}else{System.out.println(year + "-"+ month + "-0" + res);return;}}}else{res += 7 - tmp + 1;w--;while(w != 1){res += 7;w--;}res += day;if(res > count[month]){System.out.println(0);return;}if(month < 10){if(res < 10){System.out.println(year + "-0"+ month + "-0" + res);return;}System.out.println(year + "-0"+ month + "-" + res);return;}else{if(res < 10){System.out.println(year + "-"+ month + "-0" + res);return;}System.out.println(year + "-"+ month + "-" + res);return;}//System.out.println(year + "-"+ month + "-" + res);}}public static boolean isRun(int year){if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){return true;}return false;}}
第二题与牛客上的一题很类似,做项目的最大收益问题
代码如下
//贪心算法,按照成本先将所有项目升序排列,然后把能做的项目拿出来按照利润降序排列,// 选择利润最大的做,周而复始直到无项目可做。用一个大根堆和一个小根堆来完成排序操作。public static void main(String[] args) {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] params = br.readLine().split(" ");PriorityQueue<int[]> minHeap = new PriorityQueue<>((program1, program2)->program1[0] - program2[0]);PriorityQueue<int[]> maxHeap = new PriorityQueue<>((program1, program2)->program2[1] - program1[1]);int n = Integer.parseInt(params[0]), k = Integer.parseInt(params[2]);long w = Long.parseLong(params[1]);int[][] programs = new int[n][2];params = br.readLine().split(" ");for(int i=0;i<n;i++) programs[i][0] = Integer.parseInt(params[i]);params = br.readLine().split(" ");for(int i=0;i<n;i++){programs[i][1] = Integer.parseInt(params[i]);minHeap.offer(programs[i]);}//只能做k个项目for(int i=0;i<k;i++){while(!minHeap.isEmpty() && w >= minHeap.peek()[0]){maxHeap.offer(minHeap.poll());}if(maxHeap.isEmpty())break; //没有可做的项目了elsew += maxHeap.poll()[1]; //可以做的项目选利润最大的}System.out.println(w);}
第三题:超级左旋
小立是一个乒乓球手,他的“超级左旋非常强大。
小立给自己制定了一份n天的训练计划来锻炼〝超级左旋”,并旦他每天会记录下失误的次数。
每天的训练结束后,小立都会进行反思自己是否退步。
之前每有一天的失误次数比今天的多,都会使他的能力值-1。
之前每有一天的失误次数比今天的少,都会使他的能力值+1。
之前每有-一天的失误次数与今天相同,不会影响他的能力值。
每天的能力值柠继承至下一天。初始能力值为0。
因为第—天没有之前的失误次数作为对照,所以第一天结束后,能力值不会改变。
求小立能力值最高时为多少,以及训练结束后小立的最終能力值为多少。
输入要求
输入一个数字T,表示有T组测试数据。
对于每组测试数据。第一行输入一个n,表示小立训练的天数。
第二行输入n个数字,ai(1<i<n)表示小立每天的失误次数。
(1 <= n, ai<=100000)
输出要求
对于每组测试数据,输出两个数字表示小立能力值最高为多少,以及训练结束后小立的最终能力值为多少
示例
输入
2
3
1 3 2
3
2 1 3
输出
1 1
1 1
代码如下:
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int t = sc.nextInt();sc.nextLine();List<Integer[]> list = new ArrayList<>();int maxScore = 0;for(int i=0;i<t;i++){int days = sc.nextInt();sc.nextLine();String[] fault = sc.nextLine().split(" ");Integer[] faultNum = new Integer[fault.length];for(int j=0;j< fault.length;j++){faultNum[j] = Integer.parseInt(fault[j]);}list.add(faultNum);}for(int i=0;i<list.size();i++){Integer[] temp = list.get(i);int[] energy = new int[temp.length];for(int j=1;j<temp.length;j++){int high = 0;int low = 0;for(int k=1;k<=j;k++){if(temp[k-1] > temp[j]){low++;}else if(temp[k-1] < temp[j]){high++;}}energy[j] = energy[j-1] - low + high;if(energy[j] > maxScore){maxScore = energy[j];}}System.out.println(maxScore + " " + energy[energy.length - 1]);}}
不知道为啥我用暴力只过了20%,超时了