【题解】P3069 [USACO13JAN]牛的阵容Cow Lineup-C++
2024-10-06 14:30:19
思路
这道题目可以通过尺取法来完成 (我才不管什么必须用队列)
什么是尺取法呢?
顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。
之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等。当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案!
对于这道题,我们首先可以推出一个事实:
在任意一个符合条件的区间里,答案是区间内最多的那类牛的数量。
我们只需要从左到右扫描整个队列,找到每一个只含k+1种牛的区间(删除k种+保留的一种),取每个区间内数量最多牛的数量即可。
注意点: 血统编号在0-1,000,000,000之间,需要离散化。
代码
#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
int a[],lsh,cnt,l=,r,c[],ans=-;
int main()
{
int n,k;
cin>>n>>k;
for(int i=;i<=n;i++)
{
cin>>a[i];
if(!mp[a[i]])mp[a[i]]=++lsh;
a[i]=mp[a[i]];
}
while(r<=n)
{
r++;
if(!c[a[r]])cnt++;
c[a[r]]++;
while(cnt==k+)
{
c[a[l]]--;
if(!c[a[l]])cnt--;
l++;
}
ans=max(c[a[r]],ans);
}
cout<<ans<<endl;
return ;
}
最新文章
- Android笔记——Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- SQL server存储过程语法及实例(转)
- 【工具相关】iOS-Reveal的使用
- Nginx 使用 sever 段规则屏蔽恶意 User Agent
- (转)innerHTML、innerText和outerHTML、outerText的区别
- python (9)统计文件夹下的所有文件夹数目、统计文件夹下所有文件数目、遍历文件夹下的文件
- ios 基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果demo(转)
- AIX项目总结_oracle_sqlloader_01
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
- ext等待提示
- [Angular 2] Using Array ...spread to enforce Pipe immutability
- 芝麻HTTP:代理的基本原理
- SQLServer之DEFAULT约束
- 二叉搜索树的第k个节点
- UML类图中的六种关系(物理设计阶段)
- 【20】策略者模式(Strategy Pattern)
- 机器学习--Logistic回归
- ActiveReports 大数据分析报告:公交车司乘冲突引发的刑事案件
- Java的CountDownLatch和CyclicBarrier的理解和区别
- python3基础操作