• 【hash表】收集雪花


    【哈希和哈希表】收集雪花

    题目描述

    不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状。在收集的过程中,同学们不希望有重复的雪花。你可以从任意a时刻开始,在b时刻停止。a到b时刻中间的雪花也都将被收集。他们希望收集的雪花最多。

    输入

    第一行一个正整数n;第2行到第n+1行表示n个时刻雪花的形状。

    输出

    最多能收集雪花的数量。

    样例输入

    5
    1 2 3 2 1
    

    样例输出

    3
    

    提示

    n≤1e6,xi≤1e9


    【题解】

    这个题目其实用的是一种的hash方式,其实就是我们常用的离散化操作。

    1、另外一个数组存放相同数据,然后进行排序。

    2、因为大小相同可以看成一个数,所以相同的话,可以用lower_bound来写,因为是大于等于某个数,等于可以看成对应的大小关系。

    3、然后进行双指针方法来跑最大区间的不同种类的个数。


    【代码】

     1 #include<cstdio>
     2 #include<bitset>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef unsigned long long ULL ;
     7 const int N = 1e6+10;
     8 const int M = 5e6+10;
     9 const ULL base = 131;
    10 int a[N],c[N],H[M],n;
    11 ULL b[N];
    12 void Dispersed(){
    13     sort( b + 1 , b + 1 + n );
    14     for(int i=1;i<=n;i++){
    15         c[i] = lower_bound(b+1,b+1+n,a[i]) - (b+1);
    16     }
    17 }
    18 int main()
    19 {
    20     ios_base :: sync_with_stdio(false);
    21     cin.tie(NULL) , cout.tie(NULL) ;
    22  
    23     cin >> n ;
    24     for(int i=1;i<=n;i++)   cin >> a[i] ,b[i] = a[i];
    25     Dispersed();
    26      
    27     int res = 0 ;
    28     for(int i=1,j=1;j<=n;j++){
    29         H[ c[j] ] ++ ;
    30         while( H[c[j]] > 1 ) H[ c[i++] ] --;
    31         res = max( res , j-i+1) ;
    32     }
    33     printf("%d
    ",res );
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    编程这几天出现的很2的问题!!!
    2020 8 1 每日总结
    2020 8 6 每日总结
    2020 8 7 读后感
    2020 8 4 每日总结
    2020 7 30 每日总结
    2020 8 3 每日总结
    2020 8 8 每日总结
    2020 8 2 每周总结
    2020 8 5 每日总结
  • 原文地址:https://www.cnblogs.com/Osea/p/11333474.html
Copyright © 2020-2023  润新知