您的位置:首页 > 其它

zoj 3790 离散化

2014-06-05 01:38 246 查看
离散化一下然后贪心一下就好了

AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <map>
using namespace std;

const int MAXN = 110000;

vector<int> s[MAXN];
set<int> myset;
map<int,int> mp;
int N, K, a[MAXN];
set<int>::iterator p;

int calc( int g ){
int ans, now;
int ft, ls;
ft = ls = 0;
ans = 1;
now = 0;
while( 1 ){
while( now <= K && ls < s[g].size() && ft < s[g].size() ){
if( ls == s[g].size() - 1 ){
break;
}
int temp = s[g][ls+1] - s[g][ls] - 1;
now += temp;
ls++;
if( now <= K ){
ans = max( ans, ls - ft + 1 );
}
}
if( ls == s[g].size() - 1 ){
while( now > K ){
now -= s[g][ft+1] - s[g][ft] - 1;
ft++;
}
ans = max( ans, ls - ft + 1 );
break;
}
while( now > K ){
now -= s[g][ft+1] - s[g][ft] - 1;
ft++;
}
}
return ans;
}

int main(){

while( scanf( "%d%d", &N, &K ) != EOF ){
myset.clear();
mp.clear();
for( int i = 1; i <= N; i++ ){
scanf( "%d", &a[i] );
myset.insert( a[i] );
}
int top;
for( p = myset.begin(), top = 1; p != myset.end(); p++, top++ ){
mp.insert( pair<int,int>( *p, top ) );
s[top].clear();
}
for( int i = 1; i <= N; i++ ){
a[i] = mp.find( a[i] )->second;
s[a[i]].push_back( i );
}
int ans = 0;
for( int i = 1; i < top; i++ ){
ans = max( ans, calc( i ) );
}
printf( "%d\n", ans );
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: