• 集卡片(card)


    题目描述
    boboo小时候很喜欢收集卡片,他经常要去商店购买新到的卡片。
    商店出售的卡片有N张,是连续的,并且都连在一起成为一个长串,商店阿姨告诉boboo
    只能购买连续的一段,这一串卡片共有M种,每种卡片都有一个价格,boboo拿的钱数为V,他想花最少的钱来集齐所有种类的卡片,你能帮帮他吗?
    输入文件
    第1行 三个正整数 N,M,V
    第2行共M个正整数,第i个数Ti表示第i种卡片的价格
    第3行 N个正整数,表示卡片序列。
    输出文件
    1行 1个整数ans,表示boboo剩余的钱数,若不能集齐,输出’NO ans’,不含引号。
    样例输入
    5 2 20
    10 5
    1 1 2 2 1
    样例输出
    5
    注释
    【样例解释】
    购买2-3 或者 4-5 都可,花费15,剩余钱数20-15=5.
    【数据范围】
    对于100%的数据 N<=1000000 ,M<=2000 ,Ti<=2000 , V<=10^9
    对于30% 的数据 N<=2000

    从头向后扫一遍
    如果此时head到tail的价值大于钱数,就 inc(head); 直到价值<=钱数
    如果head到tail中牌的种类=m,就比较价值和最小值

    code:
    var n,m,v:longint;
    init:array[1..1000000]of longint;
    t:array[1..5000]of longint;
    i,j,k:longint;
    ans,w,min:longint;
    head,tail:longint;
    num:array[1..5000]of longint;
    kind:longint;
    begin
    kind:=0;
    fillchar(num,sizeof(num),0);
    readln(n,m,v);
    ans:=0; w:=0;
    for i:=1 to m do
    begin read(t[i]);
    ans:=ans+t[i];
    end;
    if ans>v
    then begin writeln('');

    halt;
    end;
    min:=maxlongint;
          ans:=0;
    head:=1; tail:=1;
    read(init[1]);
    inc(num[init[1]]);
    w:=t[init[1]];
    kind:=1;
    for i:=2 to n do
    begin read(init[i]);
    inc(tail);
    w:=w+t[init[tail]];
    while (w>v)and(head<=tail) do
    begin w:=w-t[init[head]];
    dec(num[init[head]]);
    if num[init[head]]=0
    then dec(kind);
    inc(head);
    end;
    inc(num[init[tail]]);
    if num[init[tail]]=1
    then inc(kind);
    if kind=m
    then begin while (head<=tail)and(num[init[head]]>1) do
    begin dec(num[init[head]]);
    w:=w-t[init[head]];
    inc(Head);
    end;
    if w<min
    then min:=w;
                            end;
    end;
    if min=maxlongint
    then writeln('NO ans')
    else writeln(v-min);

    end.



  • 相关阅读:
    打印出乘法表
    python小练习1
    JavaScript 两个变量互换
    纯css3 画一个小猪佩奇
    箭头函数
    点击获取li下标的几种方式
    再见!!!!!!
    十月一前期
    大家好!!!!!!
    雕刻技
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4893730.html
Copyright © 2020-2023  润新知