您的位置:首页 > 其它

codeforces 558B. Amr and The Large Array 解题报告

2015-07-16 21:40 295 查看
题目链接:http://codeforces.com/problemset/problem/558/B

题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值。

  由于是边读入边比较,因此问题最关键的是,记录每个数第一次出现的位置,即左值。因为要保证次数是出现最多,因此需要一个cnt[]数组来记录出现次数。然后当最多出现次数与当前cnt[x]次数相同时,要选择区间较短的,再更新左右区间值。

  赛中短路竟然想不出来~~~泪啊~~泪啊- >_<

  

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1e6 + 5;
int cnt[maxn];
int pl[maxn];   // 记录每个数第一次出现的位置

int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE

int n, a;
while (scanf("%d", &n) != EOF) {
memset(cnt, 0, sizeof(cnt));
memset(pl, 0, sizeof(pl));
int max_cnt = 0;
int min_dis = 0;
int l = 0, r = 0;

for (int i = 0; i < n; i++) {
scanf("%d", &a);

if (!cnt[a]) {
pl[a] = i;
}
cnt[a]++;

if (max_cnt < cnt[a]) {
max_cnt = cnt[a];
l = pl[a], r = i;
min_dis = i - tl;
}
if (max_cnt == cnt[a] && i-pl[a] < min_dis) {
min_dis = i - pl[a];
l = pl[a];
r = i;
}
}
printf("%d %d\n", l+1, r+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: