题目大意:

输入n 接下来n行描述n头牛的编号num和品种id

得到包含所有id的最短段 输出最短段的编号差

Sample Input

6
25 7
26 1
15 1
22 3
20 1
30 1

Sample Output

4

Hint

INPUT DETAILS:

There are 6 cows, at positions 25,26,15,22,20,30, with respective breed IDs 7,1,1,3,1,1.

OUTPUT DETAILS:

The range from x=22 up through x=26 (of total size 4) contains each of the distinct breed IDs 1, 3, and 7 represented in FJ's herd.

有思路而不会代码实现也是够痛苦

将牛按num排序后

15 20 22 25 26 30

1   1    3   7   1   1

将15为段头 直到段尾为25时符合要求出现了所有id

但 id 1 出现过两次 所以可以缩小该段 将段头移向下一位20

此时为符合要求的最小段 保存当前段的编号差

将段头移向下一位 继续移动段尾

直到符合要求进行判断 更新保存最小的编号差

#include <bits/stdc++.h>
using namespace std;
struct Cow{ int num,id; }cow[];
map <int,int> m; /// 记录id出现的次数
set <int> id_set; /// 记录出现过的品种id 得到一共有多少种品种
bool cmp(Cow q,Cow p)
{
return q.num<p.num;
} /// 结构体按编号num排序 不会重复所以不需考虑相等
int main()
{
/// num_map为符合要求的一段的该段当前id数
/// num_id为该队中的所有id数
/// head tail为当前该段的段头和段尾
int n,num_id,num_map,head,tail,mini;
while(~scanf("%d",&n))
{
id_set.clear(); m.clear();
for(int i=;i<n;i++)
{
scanf("%d%d",&cow[i].num,&cow[i].id);
m[cow[i].id]=; id_set.insert(cow[i].id);
}
sort(cow,cow+n,cmp); num_id=id_set.size(); /// set可以去重 即所有id数
head=tail=num_map=;
mini=0x3f3f3f3f; // for(int i=1;i<=n;i++)
// printf("%d %d\n",cow[i].num,cow[i].id);
// printf("\n"); while()
{
while(num_map!=num_id && tail<n)
{
if(m[cow[tail].id]==) num_map++;
m[cow[tail++].id]++;
/// 如果此id没出现过则该段当前id数+1
/// m记录该段id出现次数
} /// 持续记录id,直到该段当前id数为所有id数 或 已到队尾 if(tail==n && num_map!=num_id) break;
/// 已到队尾 且 不存在符合要求的组合 则跳出 while(m[cow[head].id ]>)
m[cow[head++].id ]--;
/// 当前id数 为 所有id数 若段头的id在该段中出现次数>1
/// 则可缩小该段长度 段头可移到下一位
/// 如 13312 这种情况可缩小该段长度到 312 mini=min(mini,cow[tail-].num-cow[head].num); m[cow[head++].id]--; num_map--;
/// 继续遍历后面有无符合要求的组合
/// 段头移到下一位 该段中当前id数-1
}
printf("%d\n",mini);
} return ;
}
/*
6
25 7
26 1
15 1
22 3
20 1
30 1
*/

...原来这是尺取法

再加种写法 ...虽然差不多

        while(head<=tail&&tail<=n)
{
if(num_map<num_id)
{
if(m[cow[tail].id]==) num_map++;
m[cow[tail++].id]++;
}
else if(num_map==num_id)
{
while(m[cow[head].id]>)
m[cow[head++].id]--;
mini=min(mini,cow[tail-].num-cow[head].num);
m[cow[head++].id]--; num_map--;
}
}

USACO 2011 November Cow Lineup /// map set 尺取法 oj25279的更多相关文章

  1. [USACO13JAN] Cow Lineup (单调队列,尺取法)

    题目链接 Solution 尺取法板子,算是复习一波. 题中说最多删除 \(k\) 种,那么其实就是找一个颜色种类最多为 \(k+1\) 的区间; 统计一下其中最多的颜色出现次数. 然后直接尺取法,然 ...

  2. POJ 3061 Subsequence 尺取法 POJ 3320 Jessica's Reading Problem map+set+尺取法

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13955   Accepted: 5896 Desc ...

  3. bzoj3048[Usaco2013 Jan]Cow Lineup 尺取法

    3048: [Usaco2013 Jan]Cow Lineup Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 225  Solved: 159[Subm ...

  4. H-The Cow Lineup(POJ 1989)

    The Cow Lineup Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5367   Accepted: 3196 De ...

  5. bzoj 3048[Usaco2013 Jan]Cow Lineup 思想,乱搞 stl

    3048: [Usaco2013 Jan]Cow Lineup Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 237  Solved: 168[Subm ...

  6. [bzoj 3048] [Usaco2013 Jan]Cow Lineup

    [bzoj 3048] [Usaco2013 Jan]Cow Lineup Description 给你一个长度为n(1<=n<=100,000)的自然数数列,其中每一个数都小于等于10亿 ...

  7. POJ 3320 尺取法,Hash,map标记

    1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...

  8. HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)

    题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...

  9. 3377: [Usaco2004 Open]The Cow Lineup 奶牛序列

    3377: [Usaco2004 Open]The Cow Lineup 奶牛序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 16  Solved ...

随机推荐

  1. 11、jQueryEasyUI的基本组件

    1.拖动的div <!--jquery 的主文件...--> <script type="text/javascript" src="../../js/ ...

  2. 计算机基础、python历史,环境,分类,安装

    一.计算机基础 CPU:大脑,处理数据,计算 内存:临时储存数据,运行速度快,成本高,断电数据会消失:4G,8G,16G,32G 硬盘:1T,固态硬盘,机械硬盘:储存数据,文件,能长久保存 操作系统: ...

  3. 关于py中lxml模块的cssselect的小问题

    今天在使用lxml进行解析页面的时候遇到了不能解析空格的问题,就是类似于: <div class="aa bb"></div> 使用cssselect('. ...

  4. <随便写>软件设计遵循的基本原则

    1.高内聚,低耦合 所谓高内聚,是指一个软件模块内各个元素彼此结合的紧密程度要高,即一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则. 所谓低耦合,是指一个软件系统内不同 ...

  5. P3410 /// 最大流最小割

    题目大意: https://www.luogu.org/problemnew/show/P3410 题解 https://www.cnblogs.com/2020pengxiyue/p/9463055 ...

  6. Android的WebView通过JS调用java代码

    做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录 ...

  7. 《代码大全2》读书笔记 Week4

    <代码大全2>第8章:防御式编程 防御式编程的主要思想是子程序应该不因为非法的输入值被破坏,就好比开车时的防御式驾驶:你无法预估其他司机将会做什么,但你要采取措施保证当他人做出危险动作时自 ...

  8. jquery获取select选中项 自定义属性的值

    <select id="serialNo" > <option value=''1' data-id="001">第一次</opt ...

  9. 使用 SpringBoot 配置发送邮件功能

    1.使用 SpringBoot 配置发送邮件功能 项目总体结构 用户表设计 SET FOREIGN_KEY_CHECKS=0; CREATE DATABASE sample; USE sample; ...

  10. 项目到上传Gitee

    1.码云上创建一个项目 testgit (名字随你) 2.本地创建一个文件夹D:/testgit,然后使用git bash 3.cd 到本地文件夹中D:/testgit, 4.使用 git init ...