牛客练习赛 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神仙案例! | 彭文华
|
存储 算法 Java
【AcWing每日一题】4818. 奶牛大学
【AcWing每日一题】4818. 奶牛大学
121 0
|
机器学习/深度学习 算法 数据库
华科2018年笔试题大概
华科2018年笔试题大概
|
算法 测试技术
蓝桥杯2022年第十三届决赛真题-卡牌——二分法
蓝桥杯2022年第十三届决赛真题-卡牌——二分法
129 0
|
机器学习/深度学习 C++
蓝桥杯C++小朋友崇拜圈
蓝桥杯C++小朋友崇拜圈
117 0
|
存储 人工智能 BI
【蓝桥杯集训·每日一题】AcWing 1249. 亲戚
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 并查集
95 0
|
人工智能 物联网 BI
牛客月赛62思考和总结
牛牛在幼稚园做义工,幼稚园中共有 nnn 颗树,第 1 天中午时它们的高度分别为:h1,h2,…,hnh_1,h_2,…,h_nh1​,h2​,…,hn​ (单位:厘米)。每一天的晚上每棵树的高度都会增加 aaa 厘米,而牛牛的任务则是在第二天的清晨检查每一颗树的高度,若某颗树的高度超过了 kkk 厘米牛牛就会将它的高度修剪为 bbb 厘米。牛牛想请你帮它计算一下第 mmm 天中午每一颗树的高度。
126 0
|
存储 人工智能
【蓝桥杯集训·周赛】AcWing 第93场周赛
文章目录 第一题 AcWing 4867. 整除数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4868. 数字替换 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4869. 异或值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
106 0
|
存储 人工智能 BI
【蓝桥杯集训·周赛】AcWing 第91场周赛
文章目录 第一题 AcWing 4861. 构造数列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4862. 浇花 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4861. 构造数列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
87 0