poj 3320 Jessica's Reading Problem

来源:互联网 发布:java list排序算法 编辑:程序博客网 时间:2024/05/19 19:39

题意:求最少复习天数 && 可以复习完书本全部知识点;

思路: 用俩个下标st ed 去扫描;中间用map 去维护区间 [st, ed] 的知识点涵盖情况;

时间复杂度: O(nlogn)  map 的复杂度;

#include<stdio.h>#include<string.h>#include<math.h>#include<string>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<list>#include<map>#include<set>using namespace std;const int N=1000010;int n, allkind ;int a[ N ];int b[ N ];map<int,int>cnt;void deal_init(){    for(int i = 0 ; i < n ; i ++){        scanf("%d", &a[ i ] ) ;        b[ i ] = a[ i ];    }    sort(b, b+n);    allkind=unique(b , b + n) - b ;//    cout << allkind << endl;}void work(){    cnt.clear();    int st=0,ed=0;    int num = 0, ans=N+100;    while( st < n ){        while( ed < n && num < allkind ){            int tp = cnt[ a[ed++] ]++;            if( tp == 0 ) num ++ ;        }        if( num < allkind ) break;        ans = min( ans , ed-st);        int tp = cnt [ a[st++] ]--;        if(tp == 1 ) num -- ;    }    cout << ans << endl;}int main(){//freopen("in.in","r",stdin);while(~scanf("%d",&n)){        deal_init();        work();}return 0;}


0 0
原创粉丝点击