牛客练习赛 3 E

简介: 算法

题意:



𝑅𝑒𝑘𝑖是一名狙击手,凭借肉眼视觉可以做到精确命中绝对半径2051公尺的一切目标。

作为一名优秀的狙击手,𝑅𝑒𝑘𝑖不仅经常保养枪支,也经常保养弹药。

𝑅𝑒𝑘𝑖有𝑛枚子弹,第𝑖枚的型号为𝐶𝑖,𝑅𝑒𝑘𝑖打算扔掉其中最多𝑘枚。

大多数优秀的狙击手都有艺术癖好,𝑅𝑒𝑘𝑖希望扔掉一部分子弹后,最

长的连续相同子弹序列的长度尽量长。


思路:

两种解法,二分或者双指针,其实很多题目能用其中一种另外一种都行,因为都要符合单调性,看到c的范围应该不难想到需要离散化,这里可以用map也可以手动哈希,算区间长度的时候比较绕,并且我都用的二维vector存他们的下标,理清楚还是好题的。


二分解法:

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
const int maxn=1e5+1000;
unordered_map<int,int >mo;
vector<int>edges[maxn];
int c[maxn];
int n,k;
int main()
{
    int i,j;
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>k;
    int cnt=1;
    for(i=1; i<=n; i++)
    {
        cin>>c[i];
        if(mo[c[i]]==0)
        {
            mo[c[i]]=cnt++;
        }
        edges[mo[c[i]]].push_back(i);
    }
    int ans=1,l,d1,r,max1,mid,s;
    for(auto x:mo)
    {
        d1=x.second,max1=0;
        if(edges[d1].size()<ans) continue;
        for(i=0; i<edges[d1].size(); i++)
        {
            l=i,r=edges[d1].size()-1,s=0;
            while(l<r)
            {
                mid=l+r+1>>1;
                if(edges[d1][mid]-edges[d1][i]+1-(mid-i+1)<=k)
                {
                    l=mid;
                }
                else
                {
                    r=mid-1;
                }
            }
            max1=max(max1,l-i+1);
        }
        ans=max(ans,max1);
    }
    cout<<ans;
    return 0;
}
/*
.......
首先离散化 用map每个出现的数字的下标都存一下
接下来我二分去寻找一下每个数字出现的最高次数
*/


双指针:


因为手玩出问题了,整了两种写法,第二种参考了一下知乎某佬的,其实都是双指针看哪种好理解点吧。

我自己的:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+1000;
map<int,int >mo;
vector<int>edges[maxn];
int c[maxn];
int n,k;
int main()
{
    int i,j;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k;
    int cnt=1;
    for(i=1; i<=n; i++)
    {
        cin>>c[i];
        if(mo[c[i]]==0)
        {
            mo[c[i]]=cnt++;
        }
        edges[mo[c[i]]].push_back(i);
    }
    int ans=1;
    for(auto x:mo)
    {
        int j=0,cnt=k,max1=0,d1=x.second;
        if(edges[d1].size()<=1) continue;
        for(i=0; i<edges[d1].size()-1; i++)
        {
            if(i>j) j=i;
            while(j<edges[d1].size()-1&&cnt>=edges[d1][j+1]-edges[d1][j]-1)
            {
                cnt-=(edges[d1][j+1]-edges[d1][j]-1);
                j++;
            }
            max1=max(max1,j-i+1);
            cnt+=(edges[d1][i+1]-edges[d1][i]-1);
        }
        ans=max(ans,max1);
    }
    cout<<ans<<endl;
    return 0;
}

某巨佬的:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1000;
map<int,int >mo;
vector<int> edges[100010];
int c[100010];
int n,k;
int main()
{
    int i,j;
    cin>>n>>k;
    int cnt=1;
    for(i=1; i<=n; i++)
    {
        cin>>c[i];
        if(mo[c[i]]==0)
        {
            mo[c[i]]=cnt;cnt++;
        }
        edges[mo[c[i]]].push_back(i);
    }
    int ans=1;
    for(auto x:mo)
    {
        if(edges[x.second].size()<=1) continue;
        int  cnt=k,max1=0,d1=x.second,l=0,r=0;
        while(l<=r&&r<edges[d1].size()-1)
        {
            if(cnt>=edges[d1][r+1]-edges[d1][r]-1)
            {
                cnt-=edges[d1][r+1]-edges[d1][r]-1;
                r++;
            }
            else{
                l++;
                cnt+=edges[d1][l]-edges[d1][l-1]-1;
            }
            max1=max(max1,r-l+1);
        }
        ans=max(ans,max1);
    }
    cout<<ans<<endl;
    return 0;
}
相关文章
|
3月前
|
存储 弹性计算 安全
阿里云轻量服务器通用型、CPU优化型、多公网IP型、国际型、容量型不同实例区别与选择参考
阿里云轻量应用服务器实例类型分为通用型、CPU优化型、多公网IP型、国际型、容量型,不同规格族的适用场景和特点不同,收费标准也不一样。本文为大家介绍轻量应用服务器通用型、多公网IP型、容量型有何区别?以及选择参考。
|
Java Spring
Spring Boot 2.X(八):Spring AOP 实现简单的日志切面
AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一种技术。
3439 1
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
234 5
|
缓存 算法 测试技术
性能测试的结果如何才算准确?
性能测试的结果如何才算准确?
368 57
|
11月前
|
Python
净利润断层策略
净利润断层策略通过分析公司财报公布后股价的异常波动来选股。当财报超预期且股价跳空高开时,视为买入信号。本文介绍了使用Python和Akshare库实现该策略的具体步骤,包括安装库、获取数据、识别断层及筛选股票等。
|
存储 缓存 Java
Android性能优化:内存管理与LeakCanary技术详解
【7月更文挑战第21天】内存管理是Android性能优化的关键部分,而LeakCanary则是进行内存泄漏检测和修复的强大工具。
|
tengine 自然语言处理 Kubernetes
Nacos2.0的K8s服务发现生态应用及规划
Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能。随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社区开始考虑如何提供更加云原生方向的功能和用法。本次分享主要介绍 Nacos 在 2.0 版本在Kubernetes 环境下对服务发现生态的应用探索成果及后续探索方向的规划。
Nacos2.0的K8s服务发现生态应用及规划
|
关系型数据库 测试技术 5G
新型SL密集型光纤连接器的设计与应用
高密度、小型化是光纤连接器的发展趋势与方向,本文针对目前光纤通信设备主流光纤连接器的接口,设计开发了一种新型SL高密度光纤连接器,它与常用的SC和LC光纤连接器相比,连接器布线密度是SC连接器的四倍和LC连接器的两倍。光纤适配器与光纤连接器是密集波分复用(DWDM)、光分路器等光通信设备接口与连接器件,用SL光纤连接器替代目前常用的LC或SC光纤连接器,可成倍的提高光通信设备接口与光纤连接器布线的密度,更好的满足光通信设备向高密度、大容量、集成化方向发展的需要。
新型SL密集型光纤连接器的设计与应用