Codeforces 558B Amr and The Large Array 数组美丽值

题意:给一个数组,记数组中出现次数最多的元素出现的次数为这个数组的美丽值,求这个数组长度最短的子数组(要连续),使得该子数组的美丽值与原数组美丽值相等。要求输出子数组的起始和结束位置下标(从1开始)。

也是个水题。每个数最大才10^6,用hash存储每个数出现的次数即可。注意有可能有多个不同的元素出现的次数都相等且为最大,需要一一判断。遍历数组的时候可以用两个值 l[i],r[i] 维护每个数最左出现的位置和最右出现的位置。这样可以直接计算长度。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <map>
using namespace std;

const int MAX = 1000005;
const int INF = 100005;
int n, a[INF], cnt[MAX], start[MAX], finish[MAX], number; //start起始下标,finish结束下标,number美丽值

void input()
{
    memset(cnt, 0, sizeof(cnt));
    for(int i = 0; i < MAX; i++)
    {
        start[i] = INF;
        finish[i] = 0;
    }
    number = 0;
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        cnt[a[i]]++;
        start[a[i]] = min(start[a[i]], i + 1); //维护起始下标
        finish[a[i]] = max(finish[a[i]], i + 1); //维护结束下标
        number = max(number, cnt[a[i]]);
    }
}

void solve()
{
    int l = 0, r = n;
    for(int i = 0; i < n; i++)
    {
        if(cnt[a[i]] == number)
        {
            if(finish[a[i]] - start[a[i]] < r - l) //长度更短
            {
                l = start[a[i]];
                r = finish[a[i]];
            }
        }
    }
    printf("%d %d\n", l, r);
}

int main()
{
    while(scanf("%d", &n) != EOF)
    {
        input();
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-28 20:11:20

Codeforces 558B Amr and The Large Array 数组美丽值的相关文章

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

题目链接:http://codeforces.com/problemset/problem/558/B 题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值. 由于是边读入边比较,因此问题最关键的是,记录每个数第一次出现的位置,即左值.因为要保证次数是出现最多,因此需要一个cnt[]数组来记录出现次数.然后当最多出现次数与当前cnt[x]次数相同时,要选择区间较短的,再更新左右区间值. 赛中短路竟然想不出来~~~泪啊~~泪啊- >_< 1 #include <io

codeforces 558B Amr and The Large Array

这个B不难.......主要就是题意和细节吧 题意是找到出现次数最多的数的左右端点值,,,一样多的话找区间最小的,,,,一样长的话找最左边的...... 改的有点乱,,,,慢慢改好的,,,,, #include<stdio.h> #include<string.h> #include <algorithm> #include <bits/stdc++.h> using namespace std; struct node { int c,b; }a[1000

codeforces 558B Amr and The Large Array-yy

题意:有一个数组,现在要削减它的尺寸,数组中相同元素的个数的最大值为数组的魅力值,要求削减后魅力值不能减少,同时要尽可能的把尺寸减到最小 分析:水题,主要是不要想复杂了,还有就是沉下心来做 代码: #include<iostream> #include<cstring> #include<algorithm> #define INF 1000000007 #define max(a,b) a>b?a:b using namespace std; int n,a[1

Codeforces Round #312 (Div. 2) B.Amr and The Large Array

Amr has got a large array of size n. Amr doesn't like large arrays so he intends to make it smaller. Amr doesn't care about anything in the array except the beauty of it. The beauty of the array is defined to be the maximum number of times that some

php获取文件 return array数组的值

array.php的代码如下<?php    return    array("a"=>"1");?> 然后再创建一个echo.php,代码如下<?php    $indb=include("array.php");    print_r($indb);?>

PHP-Manual的学习----【语言参考】----【类型】-----【array数组】

1.Array 数组  PHP 中的 数组 实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性.由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的. 解释这些结构超出了本手册的范围,但对于每种结构至少会提供一个例子.要得到这些结构的更多信息,建议参考有关此广阔主题的其它著作. 2.语法:定义数组 array()  可以用 ar

Array数组标准库

概述 Array是JavaScript的内置对象,同时也是一个构造函数,可以用它生成新的数组. 作为构造函数时,Array可以接受参数,但是不同的参数,会使得Array产生不同的行为. 无参数时,返回一个空数组: 如果使用一个正整数作为参数,则这个正整数表示新数组的长度: 如果使用非数值(字符串.布尔值.对象等)作为参数,则该值是新数组的成员: 如果参数在一个以上,则这些参数都是新数组的成员. var a1 = new Array(); var a2 = new Array(1); var a3

JS中Array数组的三大属性用法

Array数组主要有3大属性,它们分别是length属性.prototype属性和constructor属性. JS操作Array数组的方法及属性 本文总结了Array数组的3个属性,length属性.prototype属性.constructor属性使用,并附注Array数组对象的8个分类及多个方法使用,具体如下: 对象的3个属性 1.length属性 length属性 Length属性表示数组的长度,即其中元素的个数.因为数组的索引总是由0开始,所以一个数组的上下限分别是:0和length-

Array(数组)的使用

方法 说明 Concat() 连接2个或多个数组,并返回结果 Push() 向数组末尾添加一个或多个元素,并返回新的长度 Reverse() 颠倒数组中元素的顺序 Sort() 对数组的元素进行排序 Slice() 从某个已有的数组返回数组选定的元素 toString() 把数组转换成字符串 Join() 连接 toLocaleString() 把数组转换为本地字符串,并返回结果 <script type="text/javascript" language="java