牛客练习赛 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;
}
相关文章
|
存储 算法 NoSQL
膜拜!砍下13个大厂Offer神仙案例! | 彭文华
膜拜!砍下13个大厂Offer神仙案例! | 彭文华
|
人工智能 算法
【ACM】—蓝桥杯大一暑期集训Day4
【ACM】—蓝桥杯大一暑期集训Day4
95 0
|
算法
【ACM】—蓝桥杯大一暑期集训Day5
【ACM】—蓝桥杯大一暑期集训Day5
93 0
|
算法
【ACM】—蓝桥杯大一暑期集训Day3
【ACM】—蓝桥杯大一暑期集训Day3
110 0
|
算法
【ACM】—蓝桥杯大一暑期集训Day1
【ACM】—蓝桥杯大一暑期集训Day1
112 0
|
算法
【ACM】—蓝桥杯大一暑期集训Day2
【ACM】—蓝桥杯大一暑期集训Day2
102 0
|
存储 人工智能 算法
【蓝桥杯集训·最后一次周赛】AcWing 第 97 场周赛
文章目录 第一题 AcWing 4944. 热身计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4945. 比大小 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4946. 叶子节点 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
137 0
|
JavaScript BI
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录 第一题 AcWing 4876. 完美数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4877. 最大价值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4878. 维护数组 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
93 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第94场周赛
文章目录 第一题 AcWing 4870. 装物品 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4871. 最早时刻 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4872. 最短路之和 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
84 0
|
存储
【蓝桥杯集训·周赛】AcWing 第92场周赛
文章目录 第一题 AcWing 4864. 多边形 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4865. 有效类型 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4866. 最大数量 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
132 0

热门文章

最新文章