题目大意:

输入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. linux进阶之路(一):linux入门

    Linux:开源.免费得开源系统.具有高效性.稳定性.安全性.处理多并发. Linux的发行版本:基于Linux,不同的安装软件 CentOS(RedHat开源版本) RedHat Ubuntu Su ...

  2. html01. <!DOCTYPE html>

    解释 在HTML文档初,往往会有这么一句话<!DOCTYPE html>,它是html5标准网页声明,全称为Document Type HyperText Mark-up Language ...

  3. 剑指offer——47把数组排成最小的数

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.   题解: ...

  4. 重大利好,Dubbo 3.0要来了。

    关于Dubbo的好消息,2018年1月8日,Dubbo创始人之一梁飞在Dubbo交流群里透露了Dubbo 3.0正在开工的重大消息. Dubbo是阿里开源的分布式框架,已经多年停止更新处于半死不活状态 ...

  5. python语言和R语言实现机器学习算法

    <转>机器学习系列(9)_机器学习算法一览(附Python和R代码)   转自http://blog.csdn.net/han_xiaoyang/article/details/51191 ...

  6. 用redis实现悲观锁(后端语言以php为例)

    1479 锁机制 通常使用的锁分为乐观锁,悲观锁这两种,简单介绍下这两种锁,作为本文的背景知识,对这类知识已经有足够了解的同学可以跳过这部分. 乐观锁 先来看下百度百科上的解释:大多是基于数据版本( ...

  7. struts2类型转换1

    概述 从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串. HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服务器端, 必须把 ...

  8. AF_UNIX

    3.SOCK_SEQPACKET SOCK_SEQPACKET提供一个顺序确定的,可靠的,双向基于连接的socket endpoint. 与SOCK_STREAM不同的是,它保留消息边界.(表明发送两 ...

  9. python_django_在views模块中操作状态保持(session)

    什么叫状态保持? 就比如说我们登陆一个网站,登陆之后的当前页面显示的是登陆状态,但是我们要再跳转同一网站的其他页面,则显示的未登录状态,状态保持就是:我们在当前页面登陆后,再访问其他页面时也显示为登陆 ...

  10. vue computed和methods 计算属性和侦听器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...