• 【day14】每日强训——计算日期到天数转换&幸运的袋子


    计算日期到天数转换_牛客题霸_牛客网

    这道题的关键就是

    1.闰年

    2.  3月n日,是   1月+2月+n

    1. import java.util.*;
    2. public class Main {
    3. public static void main(String[] args){
    4. Scanner in = new Scanner(System.in);
    5. int y = in.nextInt();
    6. int m = in.nextInt();
    7. int d = in.nextInt();
    8. int[] day = {31,59,90,120,151,181,212,243,273,304,334,365};
    9. int sum = 0;
    10. if(m >= 2){
    11. sum = sum + day[m-2];
    12. }
    13. sum += d;
    14. if(m > 2){//如果是m是二月份就没必要进来到里面+1了
    15. if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)){
    16. sum +=1;
    17. }
    18. }
    19. System.out.println(sum);
    20. }
    21. }

    思路:定义一个按月份相加的天数数组,如果输入的月份为1月,那么就没必要加上月份,直接加day就行了,如果输入的月份大于等于2,那么就要完整的加上前面月份的天数,接着再加上该月的天数

    如果是闰年,同样的,如果输入的月份小于或者等于2的话就没必要+1了,虽然这是给闰年准备的,但是2月3 == 1月 + 3

    所以哪怕是润年,也要根据输入的月份来判断是否能加上2月这一天

    上面这段代码难想

    普通写法(苦逼写法)

    1. import java.util.*;
    2. public class Main{
    3. public static void main(String[] args){
    4. Scanner in = new Scanner(System.in);
    5. int year = in.nextInt();
    6. int month = in.nextInt();
    7. int day = in.nextInt();
    8. // //判断合法日期
    9. // if(!dayNice(year,month,day)){
    10. // return;
    11. // }
    12. //平年数组
    13. int[] arrDay = {31,28,31,30,31,30,31,31,30,31,30,31};
    14. if(isRun(year)){
    15. arrDay[1] = 29;
    16. }
    17. int sumDay = 0;
    18. for(int i = 0; i < month-1; i++){
    19. sumDay += arrDay[i];
    20. }
    21. System.out.println(sumDay+day);
    22. }
    23. //判断平年闰年
    24. public static boolean isRun(int year){
    25. if((year%4 == 0 && year % 100 != 0) || year % 400 == 0){
    26. return true;
    27. }
    28. return false;
    29. }
    30. // //判断输入是否合法
    31. // public static boolean dayNice(int year, int month, int day){
    32. // if(year >= 1000 && (month > 0 && month <13) && (day > 0 && day <= 31)){
    33. // if(isRun(year) && month==2 && day>29){
    34. // return false;
    35. // }else if(month == 2 && day>28){
    36. // return false;
    37. // }
    38. // return true;
    39. // }
    40. // return false;
    41. // }
    42. }

    楼主写的时候甚至判断了输入的日期是否合法!!!!!!!!!纯纯大冤种


    幸运的袋子_牛客题霸_牛客网

    思路:

    1先把球放在数组里,并排序

    2.从第一个球开始往下递归,先是a0和a1如果a0+a1>a0*a1,就继续往下递归,a0+a1+a2>a0*a1*a2,接着递归到a3,发现sum < mutil ,就要回溯

    3,此时sum+a3,mutil * a3, 所以回溯就是把sum-a3,mutil/3 回到上一步,那接下来就没必要再去尝试a4了,因为a3不成立,加上这个数组是有序的,接着往下是没有意义的

    4.回溯到上一层后,a0+a1+a3,因为+a2是成立的,但已经回溯回来了,就往下一个元素去尝试了

    5.有一个特殊情况,就是如果a0=1,此时的sum=mutil,但1和任何数的和都大于1和任何数的积

    所以此时不需要回溯,仍然要继续往下递归

    1. import java.util.*;
    2. public class Main {
    3. public static void main(String[] args){
    4. Scanner in = new Scanner(System.in);
    5. int n = in.nextInt();
    6. int[] a = new int[n];
    7. for(int i = 0; i < n; i++){
    8. a[i] = in.nextInt();
    9. }
    10. Arrays.sort(a);//排序
    11. System.out.println(count(a,n,0,0,1));
    12. }
    13. public static int count(int[] a, int n, int pos, int sum, int mutil){
    14. int count = 0;
    15. for(int i = pos; i < n; i++){
    16. sum = sum + a[i];
    17. mutil = mutil * a[i];
    18. if(sum > mutil){
    19. count = count + 1 + count(a,n,i+1,sum,mutil);
    20. }else if(a[i] == 1){
    21. //这里主要是用来把控,a[0] == 1 的情况
    22. count = count + count(a,n,i+1,sum,mutil);
    23. }else{
    24. break;
    25. }
    26. //到这里是被break出来的,要回溯
    27. sum = sum - a[i];
    28. mutil = mutil / a[i];
    29. //如果此刻的值和下一个值相等,就直接跳过下一个值
    30. while(i < n-1 && a[i] == a[i+1]){
    31. //要用while,不是if
    32. i++;
    33. }
    34. }
    35. return count;
    36. }
    37. }

    如果回溯回来后,发现下一个值跟当前值一样,就要跳过当前值,i++,不然继续递归相同值是没有意义的

  • 相关阅读:
    MSQL系列(十三) Mysql实战-left/right/inner join 使用详解及索引优化
    Java 操作 Excel:生成数据、设置单元格样式、设置数据有效性(hutool)
    深度学习_PyCharm入门
    使用phpMyAdmin管理WordPress数据库入门指南
    记一次曲折的拿靶标记录
    Jetson Orin平台4-16路 GMSL2/GSML1相机采集套件推荐
    PDF处理技巧分享之PDF合并:一键实现几个PDF合并成一个PDF
    1.1 三大组件
    找游戏外包开发游戏,有哪些好处呢?
    OPTEE:TA镜像的签名和加载-下(六)
  • 原文地址:https://blog.csdn.net/qq_61862008/article/details/127592693