绝对半径2051
绝对半径2051
时间限制:1秒 空间限制:131072K
https://www.nowcoder.com/acm/contest/13/E
题目描述
𝑅𝑒𝑘𝑖是一名狙击手,凭借肉眼视觉可以做到精确命中绝对半径2051公尺的一切目标。
作为一名优秀的狙击手,𝑅𝑒𝑘𝑖不仅经常保养枪支,也经常保养弹药。
𝑅𝑒𝑘𝑖有𝑛枚子弹,第𝑖枚的型号为𝐶𝑖,𝑅𝑒𝑘𝑖打算扔掉其中最多𝑘枚。
大多数优秀的狙击手都有艺术癖好,𝑅𝑒𝑘𝑖希望扔掉一部分子弹后,最
长的连续相同子弹序列的长度尽量长。
作为一名优秀的狙击手,𝑅𝑒𝑘𝑖不仅经常保养枪支,也经常保养弹药。
𝑅𝑒𝑘𝑖有𝑛枚子弹,第𝑖枚的型号为𝐶𝑖,𝑅𝑒𝑘𝑖打算扔掉其中最多𝑘枚。
大多数优秀的狙击手都有艺术癖好,𝑅𝑒𝑘𝑖希望扔掉一部分子弹后,最
长的连续相同子弹序列的长度尽量长。
输入描述:
第一行,两个整数𝑛,𝑘。
第二行,𝑛个正整数𝐶𝑖。
输出描述:
一行,一个整数,最长的连续相同子弹序列的长度。
示例1
输入
8 1 1 1 1 2 2 3 2 2
输出
4
备注:
对于10%的数据,𝑛 ≤ 10。
对于30%的数据,𝑛 ≤ 1000。
对于60%的数据,𝐶𝑖 ≤ 30。
对于100%的数据,0 ≤ 𝑘 ≤ 𝑛 ≤ 105,1 ≤ 𝐶𝑖 ≤ 109。
思路:把连续的缩成一个,然后往前跳即可
1 #include<bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 5 const int N=1e5+100; 6 ll a[N],b[N],d[N]; 7 map<ll ,int > ma,mb; 8 int n,k; 9 struct node{ 10 int id;//数字 11 int s;//数量 12 int st,en;//开始,终止// 13 }c[N]; 14 15 int hh(int x){ 16 int kk=k,s=x; 17 int sum=c[s].s,ss=0; 18 // cout<<sum<<endl; 19 while(kk){ 20 kk=kk-(c[s].st-c[b[s]].en-1); 21 if(kk<0) break; 22 if(s==b[s]) break; 23 sum+=c[b[s]].s; 24 // cout<<s<<" "<<b[s]<<" "<<sum<<endl; 25 26 s=b[s]; 27 } 28 return sum; 29 } 30 int main(){ 31 scanf("%d%d",&n,&k); 32 for(int i=1;i<=n;i++) 33 scanf("%lld",&a[i]); 34 int l=0; 35 int Max=0; 36 for(int i=1;i<=n;i++){ 37 c[++l].id=a[i]; 38 c[l].st=i; 39 int x=1; 40 while(i+1<=n&&a[i]==a[i+1]){ 41 i++;x++; 42 } 43 c[l].en=i; 44 c[l].s=x; 45 Max=max(Max,c[l].s); 46 // cout<<c[l].id<<" "<<c[l].s<<" "<<c[l].st<<" "<<c[l].en<<endl; 47 } 48 49 for(int i=1;i<=l;i++){ 50 if(ma[c[i].id]){ 51 b[i]=ma[c[i].id]; 52 } 53 else b[i]=i; 54 ma[c[i].id]=i; 55 // cout<<b[i]<<endl; 56 } 57 for(int i=2;i<=l;i++){ 58 if(b[i]==i) continue; 59 // cout<<i<<endl; 60 Max=max(Max,hh(i)); 61 } 62 cout<<Max<<endl; 63 } 64 /* 65 5 2 66 1 1 2 1 2 67 */