POJ 3320 Jessica's Reading Problem

本文展示了一个使用C++进行编程竞赛的例子,通过排序和数据处理解决了一个具体问题。涉及了基本的数据结构如数组和自定义结构体,以及比较函数的应用。

sort扫一下

注意\(++i\)的位置
cin cout 过不去

#include <cstdio>
#include <algorithm>
#include <cassert>

using namespace std;

const int MAXN=1000111;
const int MAXM=MAXN;

int N;
int M;
int Vc[MAXM];
int Cnt=0;
int ANS;

struct Page {
    long long v;
    int id, k;
} P[MAXN];

bool cmpv(Page A, Page B) {
    if(A.v==B.v)    return A.id<B.id;
    return A.v<B.v;
}

bool cmpid(Page A, Page B) {
    return A.id<B.id;
}

int main() {

    while(scanf("%d", &N)!=EOF) {
        for(int i=1; i<=N; ++i) {
            scanf("%lld", &P[i].v);
            P[i].id=i;
        }
        sort(P+1, P+N+1, cmpv);
        P[1].k=1;
        for(int i=2; i<=N; ++i) {
            P[i].k=P[i-1].k;
            if(P[i].v!=P[i-1].v)    ++P[i].k;
        }
        M=P[N].k;
        sort(P+1, P+N+1, cmpid);
        ANS=N;
        for(int i=1, j=0; i<=N; ++i) {
            while(Cnt<M && j<N) {
                ++j;
                ++Vc[P[j].k];
                if(Vc[P[j].k]==1)   ++Cnt;
            }
            if(Cnt==M) {
                ANS=min(ANS, j-i+1);
            }
            //++i;
            --Vc[P[i].k];
            if(Vc[P[i].k]==0)   --Cnt;
        }
        assert(Cnt==0);
        printf("%d\n", ANS);
    }

    return 0;
}

转载于:https://www.cnblogs.com/Pickupwin/p/9029461.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值