Codeforces 558B Amr and The Large Array(hash)

来源:互联网 发布:淘宝网活动 编辑:程序博客网 时间:2024/05/20 02:26

题意:

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

解析:

也是个水题。每个数最大才106,用hash存储每个数出现的次数即可。输入的时候用一个结构体记录最左边的位置,和最右边的位置,以及区间的长度和每个值出现的次数,再把hash存入vector中,最后在排序一遍,优先按照出现的次数排序一遍,如果出现次数相同,按照区间的大小排序。最后输出vector的第一个。

my code

#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>#include <vector>#include <map>using namespace std;const int N = 1e5 + 10;struct Node {    int st, end, len, cnt;    Node() {        st = end = len = cnt = 0;    }    Node(int _st, int _end, int _len, int _cnt) {        st = _st, end = _end, len = _len;        cnt = _cnt;    }};map<int, Node> mp;map<int, Node>::iterator it;vector<Node> vec;bool cmp(Node a, Node b) {    if(a.cnt != b.cnt)        return a.cnt > b.cnt;    return a.len < b.len;}int n;int main() {    //freopen("in.txt", "r", stdin);    while(scanf("%d", &n) != EOF) {        mp.clear();        vec.clear();        int val;        for(int i = 1; i <= n; i++) {            scanf("%d", &val);            if(!mp.count(val)) {                mp[val] = Node(i, i, 1, 1);            }else {                Node& node = mp[val];                node.end = i;                node.len = node.end - node.st + 1;                node.cnt++;            }        }        for(it = mp.begin(); it != mp.end(); it++) {            vec.push_back(it->second);        }        sort(vec.begin(), vec.end(), cmp);        printf("%d %d\n", vec[0].st, vec[0].end);    }    return 0;}
0 0
原创粉丝点击