Code Forces 558 B. Amr and The Large Array(水~)

来源:互联网 发布:微信破解密码软件 编辑:程序博客网 时间:2024/06/08 07:42

Description
给一个数组,记数组中出现次数最多的元素出现的次数为这个数组的美丽值,求这个数组长度最短的子数组(要连续),使得该子数组的美丽值与原数组美丽值相等。要求输出子数组的起始和结束位置下标(从1开始)
Input
第一行为一个整数n表示数组长度,第二行n个整数表示该数组
Output
输出子数组的起始及结束下标
Sample Input
6
1 2 2 1 1 2
Sample Output
1 5
Solution
统计每个数字出现的次数及其起始结束位置,对次数排序,次数相同则对结束位置与起始位置的差值排序即可
Code

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define maxn 1000005struct node{    int l,r,num,d;}a[maxn];int cmp(node a,node b){    if(a.num!=b.num)//对出现次数排序         return a.num>b.num;    if(a.d!=b.d)//对出现的结束位置与起始位置的差值排序         return a.d<b.d;    return a.l<b.l;//对出现的起始位置排序 }int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)        {            int temp;            scanf("%d",&temp);            if(a[temp].num)//该数已经出现过,更新其出现的结束位置                 a[temp].r=i;            else//该数未出现过,更新其出现的起始以及结束位置                 a[temp].r=a[temp].l=i;            a[temp].num++;//该数的出现次数加一         }        int k=0;        for(int i=0;i<=maxn;i++)            if(a[i].num)            {                a[k].num=a[i].num;                a[k].l=a[i].l;                a[k].r=a[i].r;                a[k].d=a[i].r-a[i].l;                 k++;            }        sort(a,a+k,cmp);        printf("%d %d\n",a[0].l,a[0].r);    }    return 0;}
0 0
原创粉丝点击