Problem D: 奶牛阵容 |NFOJ-NEW
题目描述
农场主约翰雇了一位专业摄影师给一些他的奶牛拍照。由于FJ的奶牛代表各种不同的品种,他希望照片中不同品种的奶牛至少有一头来出现。
FJ 的
请帮助 FJ 计算一张照片的最低成本,照片中FJ的牛群中不同品种的奶牛都至少有一头。
输入格式:
第 1 行:奶牛数量,
第 2 行...
母牛这两个数最多都是 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 行:一张包含不同品种
示例输出
4
输出详细信息:
从
从题目可知,这一题是用尺取法。
实际上有些问题,比如 母牛这两个数最多都是 10 亿 。
这个数太大了,不能用数组存储。
其它数据不大,比如
假设有 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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步