• 算法学习(二)


    14天阅读挑战赛
    努力是为了不平庸~
    算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~

    你可以从以下几个方面着手(不强制),或者根据自己对话题主题的理解创作,参考如下:

    提醒:在发布作品前请把不用的内容删掉

    算法知识点

    贪心算法,何谓谓贪心,就是选择当前看来是最好,最优的一种策略。

    算法题目来源

    C语言网,地址:https://www.dotcpp.com/oj/problem2109.html

     

    算法题目描述

    输出格式有“最大”字眼。

    做题思路

    根据题意,从"最大战力算法平均值之和”出发,可分别算出n1,n2豪杰数所在城池的算法平均值。然后再相加。那怎样才能确保战力算法平均值最大呢,当然是将豪杰战力从大到小排序,然后从中抽取前n1+n2个数,那战力前n1+n2个豪杰怎么分配个两个城池呢?只有战力靠前的豪杰分配到所需豪杰最少的城池,然后将抽取出的剩下豪杰数分配给第二个城池,这种决策才是最优的,也符合贪心的

    模板代码

    1. import java.util.Arrays;
    2. import java.util.Scanner;
    3. // 注意类名必须为 Main, 不要有任何 package xxx 信息
    4. public class Main {
    5. public static void main(String[] args) {
    6. Scanner in = new Scanner(System.in);
    7. double sum1=0;double average1=0;
    8. double sum2=0;double average2=0;
    9. // double n=in.nextDouble();
    10. int n=in.nextInt();
    11. int n1=in.nextInt();
    12. int n2=in.nextInt();
    13. int[] array=new int[ n];
    14. for(int i=0;i
    15. {
    16. array[i]=in.nextInt();
    17. }
    18. Arrays.sort(array);
    19. // for(int i=0;i
    20. // {
    21. // System.out.println(array[i]);
    22. // }
    23. int min=Math.min(n1,n2);
    24. if(min!=n1)
    25. { int t=n1;
    26. n1=n2;
    27. n2=t;
    28. }
    29. for(int i=array.length-1;i>array.length-1-min;i--)
    30. {
    31. sum1+=array[i];
    32. }
    33. // System.out.println(sum1);
    34. average1=sum1/min;
    35. // System.out.println(average1);
    36. for(int i=array.length-1-min;i>array.length-1-n1-n2;i--)
    37. {
    38. sum2+=array[i];
    39. }
    40. // System.out.println(sum2);
    41. average2=sum2/n2;
    42. // System.out.println(average2);
    43. System.out.printf("%.6f",average1+average2);
    44. }
    45. // public double average(int m){
    46. //
    47. // }
    48. //
    49. }

    化简得

    1. import java.util.Arrays;
    2. import java.util.Scanner;
    3. public class Main {
    4. public static void main(String[] args) {
    5. Scanner in = new Scanner(System.in);
    6. double sum1=0;double average1=0;
    7. double sum2=0;double average2=0;
    8. int n=in.nextInt();
    9. int n1=in.nextInt();
    10. int n2=in.nextInt();
    11. int[] array=new int[ n];
    12. for(int i=0;i
    13. {
    14. array[i]=in.nextInt();
    15. }
    16. Arrays.sort(array);//从小到大进行排序
    17. int min=Math.min(n1,n2);
    18. //保证城池n1为需要的最小豪杰数
    19. if(min!=n1)
    20. { int t=n1;
    21. n1=n2;
    22. n2=t;
    23. }
    24. //n1组豪杰数的算术平均值
    25. for(int i=array.length-1;i>array.length-1-min;i--)
    26. {
    27. sum1+=array[i];
    28. }
    29. average1=sum1/min;
    30. //n2组豪杰数的算法平均值
    31. for(int i=array.length-1-min;i>array.length-1-n1-n2;i--)
    32. {
    33. sum2+=array[i];
    34. }
    35. average2=sum2/n2;
    36. //相加后格式输出
    37. System.out.printf("%.6f",average1+average2);
    38. }
    39. }

    做题过程中遇到的bug及解决方案

    格式输出不要弄错,做题前将思路理一遍,最好写在纸上。

  • 相关阅读:
    从0开始搭建ELK日志收集系统
    MySQL之视图、存储过程
    Android系统组成概要
    计算机网络
    【Java】常用API——Object、StringBuilder、包装类
    Android OpenGL ES 总结之FBO
    怎么去别人的github工程下载
    LeetCode 第10题:正则表达式匹配(Python3解法)
    算法竞赛入门【码蹄集新手村600题】(MT1451-1500)
    软件测试必备:如何编写测试用例?
  • 原文地址:https://blog.csdn.net/qq_58259539/article/details/127597543