跳到主要内容

P5614. 双十一最低实付

场次:2026年10月10日-非AI方向 · 来源:CodeFun2000 P5614

题目描述​

临近双十一,小明打算采买一批货物。其中 aa 件属于非买不可,另外 bb 件是可加可不加的凑单货。他手里同时还攥着 cc 张券,每一张都标明了种类(减钱或者打折)以及启用条件。请算出小明把账结清时,实际掏出的钱最少能压到多少。

规则说明:

1、货物怎么买:

  • 凡是非买不可的货,都要一件不落地全部拿下。
  • 凑单货由你决定放进或不放进购物车,同一件至多放进一次。

2、券怎么启用:

  • 每一张券至多启用一次,也可以整张弃用。
  • 启用的先后允许自行排列,应当找出让实付最小的那种次序。
  • 每张券带一个启用条件 gg(正整数)。意思是,套用它的前一刻,订单现价得满足 ≥g\geq g,不然这张就不能套用。

3、券分成哪两类:

  • f=0f = 0:减钱券。套用之后,把现价立刻扣掉 dd(正整数)。
  • f=1f = 1:打折券。套用之后,现价改写成 floor(现价×d/100)\text{floor}(\text{现价} \times d / 100),也就是把小数直接舍掉。
  • 注意:一张券生效完毕,算出来的新现价,会变成后面其余券的对照基准。

输入格式​

第一行给出三个整数 aa、bb、cc(1≤a≤101 \le a \le 10,0≤b≤100 \le b \le 10,0≤c≤50 \le c \le 5)。

紧随其后单独一行,写下 aa 个整数,依次是非买不可那些货的标价(单个标价 ≤1000\le 1000)。

再往后一行,写下 bb 个整数,依次是凑单货的标价(单个标价 ≤1000\le 1000)。当 b=0b = 0 时,这一行直接省掉。

最后还有 cc 行,每一行对应一张券,书写次序是 ff、gg、dd。

ff 只允许取 00 或者 11。

gg 和 dd 都得是正整数(若该券属于打折,则 dd 代表折扣比例,比如写 8080 就是按八折计)。

输出格式​

交出一行,里面只放一个整数,代表结账最少要掏的钱。

提示​

提示

1、要是全部选定的券都套完后,现价掉成了负数,交卷时改记成 00。

示例​

示例 1​

输入:

2 1 2
80 40
30
0 150 40
1 100 80

输出:

88

说明:

只拿非买不可的两件,标价相加是 80+40=12080 + 40 = 120。减钱券要现价至少 150150,此刻用不上;打折券可以套,120×80/100=96120 \times 80 / 100 = 96。

把标价 3030 的凑单货也放进去,现价变成 150150。先扣掉 4040 得到 110110,再按八折得到 ⌊110×80/100⌋=88\lfloor 110 \times 80 / 100 \rfloor = 88。若先打八折得到 120120,就够不着减钱券的条件,实付停在 120120。只扣不折是 110110,只折不扣是 120120。这几种结法里最小的是 8888。

示例 2​

输入:

2 1 2
60 40
20
0 100 30
1 80 50

输出:

45

说明:

非买不可的两件合计 60+40=10060 + 40 = 100。这时先按五折计算得到 5050,减钱券的条件就达不到;先扣掉 3030 得到 7070,五折券要求现价至少 8080,同样套不上。所以只拿这些必买货,最好是 5050。

再放入标价 2020 的凑单货,现价升到 120120。先扣掉 3030 得到 9090,接着按五折得到 ⌊90×50/100⌋=45\lfloor 90 \times 50 / 100 \rfloor = 45。先按五折会得到 6060,减钱券要求的 100100 够不着。因此实付最少是 4545。

加载评论中...