• 利用TreeMap来解决P3029 [USACO11NOV] Cow Lineup S


    P3029 [USACO11NOV] Cow Lineup S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    好了,我们首先要统计奶牛的种类数量n,好与接下来我们记录一个范围内的奶牛的数量作比较,一旦我们统计范围内的奶牛的数量m达到我们刚开始记录的奶牛的数量n我们就开始统计最小距离.

    当然,首先我们要设计一个奶牛类,记录奶牛的编号和距离。

    接下来统计奶牛的数量

    在这里说一下题目的核心逻辑首先左边界从0开始,因为我们的第一头奶牛对应的是a【0】,那为什么右边界从-1开始呢,因为右边界随着枚举而增加。好比是从0开始到number-1,右边边界就从

    0到number-1.核心逻辑是我们保证左边界所对应的编号的奶牛的数量始终为1,一旦大于一就进行递减,操作是舍弃最左边元素,就是说吧左边界往有移动一位,然后看看新的左边界是否对应的编号的奶牛的数量也是1,不是的话接着按上述操作进行。因为一旦在我们枚举的过程中,我们发现左边界的编号所对应的奶牛的数量不是1的话,那肯定在最右边又出现了以此左边界的编号,所以我们就将左边界右移一位,不影响我们的整体答案和种类数。当我们总类数目达到之前我们计算的时候,那就我们开始选取最小答案。

    详情见代码:

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. import java.io.PrintWriter;
    5. import java.math.BigInteger;
    6. import java.math.MathContext;
    7. import java.security.PublicKey;
    8. import java.sql.SQLIntegrityConstraintViolationException;
    9. import java.util.ArrayList;
    10. import java.util.Arrays;
    11. import java.util.Collections;
    12. import java.util.Comparator;
    13. import java.util.HashMap;
    14. import java.util.Iterator;
    15. import java.util.LinkedList;
    16. import java.util.PriorityQueue;
    17. import java.util.Scanner;
    18. import java.util.TreeMap;
    19. import java.util.TreeSet;
    20. public class Main {
    21. public static void main(String[] args) throws NumberFormatException, IOException {
    22. Scanner sc=new Scanner(System.in);
    23. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    24. PrintWriter pw1=new PrintWriter(System.out);
    25. String[] aStrings=br.readLine().split(" ");
    26. number=Integer.parseInt(aStrings[0]);
    27. int a;
    28. int he=0;
    29. for(a=0;a
    30. String[] bStrings=br.readLine().split(" ");
    31. int b=Integer.parseInt(bStrings[0]);
    32. int c=Integer.parseInt(bStrings[1]);
    33. aaNainius[a]=new nainiu(b, c);
    34. if(tm1.containsKey(c)==false) {//统计有集中编号的奶牛,he变量就是奶牛的总数量
    35. tm1.put(c, 1);
    36. he++;
    37. }
    38. }
    39. //System.out.println("DDD"+he);
    40. Arrays.sort(aaNainius,0,number,new Comparator() {//将所有的额奶牛按照初始位置排序
    41. @Override
    42. public int compare(nainiu o1, nainiu o2) {
    43. // TODO Auto-generated method stub
    44. return o1.juli-o2.juli;
    45. }
    46. });
    47. tm1.clear();//清空map集合的存储的内容
    48. //System.out.println(hm1.size());
    49. int left=0;//范围的左边界
    50. int right=-1;//范围的右边边界
    51. int sum=0;//种类的数量
    52. int answer=Integer.MAX_VALUE;
    53. //Arrays.fill(id, 0);
    54. //System.out.println(Arrays.toString(aaNainius));
    55. for(a=0;a
    56. if(tm1.containsKey(aaNainius[a].id)==false) {//如果这一种编号不在我们的范围里那就种类数加一,把它放进我们的集合中
    57. tm1.put(aaNainius[a].id, 1);
    58. sum++;
    59. }
    60. else {
    61. int b1=tm1.get(aaNainius[a].id);
    62. b1++;//否则吧编号对应的数量加一
    63. tm1.put(aaNainius[a].id, b1);
    64. }
    65. right++;//右边随着边界扩展而不断扩展
    66. //qq1[++right]=new nainiu(aaNainius[a].juli, aaNainius[a].id);
    67. while (tm1.get(aaNainius[left].id)>1) {//当最左边的编号的数量大于一时,我们可以开始减减了
    68. int c1=tm1.get(aaNainius[left].id);
    69. c1--;
    70. tm1.put(aaNainius[left].id, c1);
    71. left++;//别忘记左边界加加
    72. }
    73. if(sum==he) {
    74. answer=Math.min(answer, aaNainius[right].juli-aaNainius[left].juli //当凑其种类数目时开始选取最小值/*qq1[right].juli-qq1[left].juli*/);
    75. //System.out.println("AAA"+answer);
    76. if(right==5000) {
    77. System.out.println("CCC"+answer);
    78. }
    79. }
    80. }
    81. System.out.println(answer);//打印答案
    82. }
    83. public static TreeMap tm1=new TreeMap<>();//用于记录每种编号的奶牛的数目
    84. //第一个变量是编号,第二个是编号对应的奶牛的数目
    85. public static nainiu[] aaNainius=new nainiu[50009];//奶牛类的数组
    86. //public static nainiu[] qq1=new nainiu[50009];
    87. public static int number;//奶牛的总数量
    88. }
    89. class nainiu{//奶牛类:第一个变量记录每头奶牛的位置,接下来记录奶牛的id
    90. int juli;
    91. int id;
    92. public nainiu(int juli, int id) {
    93. super();
    94. this.juli = juli;
    95. this.id = id;
    96. }
    97. @Override
    98. public String toString() {
    99. return "nainiu [juli=" + juli + ", id=" + id + "]";
    100. }
    101. }

  • 相关阅读:
    [附源码]Python计算机毕业设计宠物销售管理系统
    数据库(MySQL)的存储过程
    PyTorch学习笔记-神经网络Torch.NN基本骨架的使用及卷积原理
    玩转ansys——微机械车轮的实体建模与网格化
    数据库及程序日常开发命名实践【四期】
    STM32:时钟树原理概要
    通过shiro进行按钮及页面访问url的权限控制
    JAVA多线程(5)
    哪种主机更适合初创公司租用?云主机与共享主机
    python 异步线程 实现 异步生产 同步通信
  • 原文地址:https://blog.csdn.net/m0_73862548/article/details/133976380