绝对半径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 */

 

posted on 2017-10-15 12:44  hhhhx  阅读(544)  评论(0编辑  收藏  举报

导航