利用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的话,那肯定在最右边又出现了以此左边界的编号,所以我们就将左边界右移一位,不影响我们的整体答案和种类数。当我们总类数目达到之前我们计算的时候,那就我们开始选取最小答案。

详情见代码:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.math.MathContext;
import java.security.PublicKey;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
public class Main {	public static void main(String[] args) throws NumberFormatException, IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br.readLine().split(" ");
number=Integer.parseInt(aStrings[0]);
int a;
int he=0;
for(a=0;a<number;a++) {String[] bStrings=br.readLine().split(" ");int b=Integer.parseInt(bStrings[0]);int c=Integer.parseInt(bStrings[1]);aaNainius[a]=new nainiu(b, c);if(tm1.containsKey(c)==false) {//统计有集中编号的奶牛,he变量就是奶牛的总数量tm1.put(c, 1);he++;}}
//System.out.println("DDD"+he);
Arrays.sort(aaNainius,0,number,new Comparator<nainiu>() {//将所有的额奶牛按照初始位置排序@Overridepublic int compare(nainiu o1, nainiu o2) {// TODO Auto-generated method stubreturn o1.juli-o2.juli;}
});
tm1.clear();//清空map集合的存储的内容
//System.out.println(hm1.size());
int left=0;//范围的左边界
int right=-1;//范围的右边边界
int sum=0;//种类的数量
int answer=Integer.MAX_VALUE;
//Arrays.fill(id, 0);
//System.out.println(Arrays.toString(aaNainius));
for(a=0;a<number;a++) {if(tm1.containsKey(aaNainius[a].id)==false) {//如果这一种编号不在我们的范围里那就种类数加一,把它放进我们的集合中tm1.put(aaNainius[a].id, 1);sum++;}else {int b1=tm1.get(aaNainius[a].id);b1++;//否则吧编号对应的数量加一tm1.put(aaNainius[a].id, b1);}right++;//右边随着边界扩展而不断扩展//qq1[++right]=new nainiu(aaNainius[a].juli, aaNainius[a].id);while (tm1.get(aaNainius[left].id)>1) {//当最左边的编号的数量大于一时,我们可以开始减减了int c1=tm1.get(aaNainius[left].id);c1--;tm1.put(aaNainius[left].id, c1);left++;//别忘记左边界加加}if(sum==he) {	answer=Math.min(answer, aaNainius[right].juli-aaNainius[left].juli //当凑其种类数目时开始选取最小值/*qq1[right].juli-qq1[left].juli*/);//System.out.println("AAA"+answer);if(right==5000) {System.out.println("CCC"+answer);}}
}
System.out.println(answer);//打印答案
}public static TreeMap<Integer, Integer> tm1=new TreeMap<>();//用于记录每种编号的奶牛的数目
//第一个变量是编号,第二个是编号对应的奶牛的数目public static nainiu[] aaNainius=new nainiu[50009];//奶牛类的数组//public static nainiu[] qq1=new nainiu[50009];public static int number;//奶牛的总数量}
class nainiu{//奶牛类:第一个变量记录每头奶牛的位置,接下来记录奶牛的idint juli;int id;public nainiu(int juli, int id) {super();this.juli = juli;this.id = id;}@Overridepublic String toString() {return "nainiu [juli=" + juli + ", id=" + id + "]";}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20231018刷题记录

P1878 舞蹈课 堆。 对于“舞蹈技术差”这一变量&#xff0c;可以想到用优先队列维护实现 O ( log ⁡ n ) O(\log n) O(logn) 级别的复杂度。 对于整个舞蹈队伍的删除操作&#xff0c;可以用双向链表维护&#xff0c;比较经典的应用是开车旅行。这个东西首先比 STL 方便&#x…

C语言【文件】

目录 概念 文件名 文件的打开和关闭 fopen fclose 输入输出函数 fputc fgetc fputs fgets fprintf fscanf fwrite fread 三种流 scanf和sprintf 结构体转化 ​编辑 文件的随机读写 fseek ftell rewind 文本文件和二进制文件 文件读取结束的判定 文件缓冲…

C++标准模板(STL)- 类型支持 (运行时类型识别,type_info )

运行时类型识别 定义于头文件 <typeinfo> 含有某个类型的信息&#xff0c;由实现生成。​​这是 typeid 运算符所返回的类。 std::type_info 定义于头文件 <typeinfo> class type_info; 类 type_info 保有一个类型的实现指定信息&#xff0c;包括类型的名称和…

【论文解读】Parameter-Efficient Transfer Learning for NLP

一. 介绍 1.1 为什么要引入Adapter 在存在许多下游任务的情况下&#xff0c;微调的参数效率很低:每个任务都需要一个全新的模型。作为替代方案&#xff0c;我们建议使用适配器模块进行传输。 1.2 论文目标 目标是建立一个在所有这些方面都表现良好的系统&#xff0c;但不需…

docker图形胡界面管理工具--Portainer可视化面板安装

1.安装运行Portainer docker run -d -p 8088:9000 \ > --restartalways -v /var/run/docker.sock:/var/run/docker.sock --privilegedtrue portainer/portainer--restartalways&#xff1a;Docker启动后容器自动启动 -p&#xff1a;端口映射 -v&#xff1a;路径映射2.通过…

写一个简单的解释器(2) 构建标记流

确定标记类型 分为几个大类&#xff1a; 用户符号&#xff08;类型/标识符/数字/字符串…)关键字 (流程控制和定义符)括号 &#xff08;这里暂时认为 [] 属于括号&#xff09;分号 上述四类标记基本囊括了 vc \texttt{vc} vc 中的所有最小单元的类型&#xff0c;但是因为构…

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数&#xff0c;设计算法找到只出现一次的整数&#xff1f;2、给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f;&#xff08;1&#xff09;用一个位图…

JAVA基础(JAVA SE)学习笔记(七)面向对象编程(进阶)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

Ubuntu下 u2net tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

nginx部署vue项目(访问路径加前缀)

nginx部署vue项目(访问路径加前缀) nginx部署vue项目&#xff0c;访问路径加前缀分为两部分&#xff1a; &#xff08;1&#xff09;修改vue项目&#xff1b; &#xff08;2&#xff09;修改nginx配置&#xff1b; vue项目修改 需注意&#xff0c;我这是vue-cli3配置&#x…

某验四代滑块验证码逆向分析

逆向目标 目标&#xff1a;某验四代滑块验证码&#xff0c;w 参数逆向主页&#xff1a;aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法&#xff1a;RSA、AES 通讯流程 验证码流程分析 进入网页后&#xff0c;打开开发者人员工具进行抓包&#xff0c;点击滑动拼图验证&#xff0c…

Vue3语法-双向绑定

点击加入精英计划可以加入 点击名字可以删除 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- vue.js --><script src"https://unpkg.com/vue3/dist/vue.glob…

微软正式发布开源应用平台 Radius平台

“ 10 月 18 日&#xff0c;微软 Azure 孵化团队正式发布开源应用平台 Radius&#xff0c;该平台将应用程序置于每个开发阶段的中心&#xff0c;重新定义应用程序的构建、管理与理解方式。” 简单的概括就是&#xff0c;它和Kubernetes不一样&#xff0c;Radius将应用程序放在每…

在Windows下Edge浏览器OA发起流程问题

在Edge浏览器中发起流程 如上图所示&#xff0c;不能正常打开Excel&#xff0c;自动将Excel表格转为了PDF 怎么处理&#xff1f;还得使用IE浏览器来访问&#xff0c;但打开IE后又自动跳转到Edge&#xff0c;根本就不给使用&#xff0c;在Edge下使用IE模式也解决不了这个问题。…

项目管理实战总结(二)-沟通路径

在一个大型的项目管理中&#xff0c;不同的沟通路径&#xff0c;会对整个事情的进展形成不同的影响。从项目管理的视角来看&#xff0c;该如何驱动项目有效进展&#xff0c;失之毫厘谬以千里。 沟通路径&#xff1a;调查问卷的推动事宜 在项目进行到了后期&#xff0c;甲方希…

python学习笔记7-图的建立常用技巧

题目链接 题目中给了邻接链表&#xff0c;转为邻接矩阵初始化邻接矩阵 graph [[] for _ in range(n)]dfs() 的写法&#xff0c; 用visi避免重复访问&#xff0c;得到每个点所在的联通分量中点的个数 class Solution:def countPairs(self, n: int, edges: List[List[int]]) -…

JVM的几个面试重点

JVM的内存区域划分 JVM类加载机制 前言 Java程序最开始是一个 .java 的文件&#xff0c;JVM把它编译成 .closs 文件&#xff08;字节码文件&#xff09;&#xff0c;运行 Java 程序&#xff0c; JVM 就会读取 .class 文件&#xff0c;把文件内容读取到内存中&#xff0c;构造出…

YOLOv5:修改backbone为SPD-Conv

YOLOv5&#xff1a;修改backbone为SPD-Conv 前言前提条件相关介绍SPD-ConvYOLOv5修改backbone为SPD-Conv修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

HammerDB的安装和使用(超详细)

目录 ​编辑 一、HammerDB的介绍 二、HammerDB的安装 1、下载hammerdb安装包 2、权限配置以及安装 3、查看安装目录 三、安装前的配置 1、启动监听 2、启动数据库 3、创建表空间 1.修改临时表空间 2…

【源码解析】Spring源码解读-bean的加载

Spring的整体流程其实就是通过配置 xml、注解将自定义bean类信息进行配置&#xff0c;然后通过BeanDefinitionReader读取配置信息&#xff0c;由Dom转换成xml解析成Docment。在通过加载的配置信息进行初始化Bean对象&#xff0c;然后在对象的前后进行处理&#xff0c;也就是不同…