Problem D: 奶牛阵容 |NFOJ-NEW

题目描述

农场主约翰雇了一位专业摄影师给一些他的奶牛拍照。由于FJ的奶牛代表各种不同的品种,他希望照片中不同品种的奶牛至少有一头来出现。

FJ 的 NN 头奶牛都站在一条线上的不同位置,每头由整数位置(即其 xx 坐标)以及品种 IDID 。 FJ 计划拍摄沿线连续的奶牛,这张照片的价格与它的长度大小相等,是指照片范围内的奶牛的最大位置与最小位置的差。

请帮助 FJ 计算一张照片的最低成本,照片中FJ的牛群中不同品种的奶牛都至少有一头。

输入格式:

第 1 行:奶牛数量, NN1N500001 \le N \le 50000)。

第 2 行... 1+N1+N 行:每行包含两个空格分隔的正整数,表示指定单个对象的 xx 坐标和品种 IDID

母牛这两个数最多都是 10 亿。

示例输入

6

25 7

26 1

15 1

22 3

20 1

30 1

输入详细信息:

共有 6 头牛,位置分别为 25 , 26 , 15 , 22 , 20 , 30 ,各自品种 ID 为 7 , 1 , 1, 3 , 1 , 1 。

输出格式:

第 1 行:一张包含不同品种 IDID 的照片的最低成本。

示例输出

4

输出详细信息:

x=22x=22x=26x=26 (总尺寸为 4 )的范围包含 FJ 牛群中代表的不同品种 IDID 1 、 3 和 7 。


从题目可知,这一题是用尺取法。

实际上有些问题,比如 母牛这两个数最多都是 10 亿

这个数太大了,不能用数组存储。

其它数据不大,比如 N50000N \leq 50000 ,我们也无需知道牛的 ID 具体是什么。那么就有简单的做法了——>离散化。

假设有 ID[i] 为 1e9,无法用数组存储,但是如果给他重新取一个 ID 为 1。

当提到 ID[i] 的时候,只需要用这个较小的 ID 就有了 ID[i] 的效果。那么ID最多也只会用 50000 个元素,极大地减少空间使用。

#include<bits/stdc++.h>
using namespace std;
int n,a[51111],id[51111],cnt,b[51111],ans=1145141919;
map<int,int>ck;
int sid[51111];
bool cmp(int x,int y) {
	return a[x]<a[y];
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>a[i]>>id[i];
		sid[i]=i;
		if(ck[id[i]]==0) ck[id[i]]=++cnt;
		id[i]=ck[id[i]];
	}
	sort(sid+1,sid+n+1,cmp);
	int l=1,r=1,get=1;
	b[id[sid[r]]]=1;
	while(r<=n) {
		while(get!=cnt) {
			r++;
			b[id[sid[r]]]++;
			if(b[id[sid[r]]]==1) get++;
//			cout<<l<<" "<<r<<" "<<get<<"\n";
		}
		while(get==cnt&&r<=n&&l<r) {
//			cout<<l<<" "<<r<<" "<<a[sid[r]]<<" "<<a[sid[l]]<<"\n"; 
			ans=min(ans,a[sid[r]]-a[sid[l]]);
			b[id[sid[l]]]--;
			if(b[id[sid[l]]]==0) get--;
			l++;
		}
	}
	cout<<ans;
	return 0;
}
```cpp

本文作者:cjrqwq

本文链接:https://www.cnblogs.com/yfzqwq/p/18492837

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   cjrqwq  阅读(7)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
展开
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.