whu新生赛:一道简单的贪心,然鹅我并不会做
Posted zarax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了whu新生赛:一道简单的贪心,然鹅我并不会做相关的知识,希望对你有一定的参考价值。
C 仓鼠与奶茶
时间限制: 2000/1000 MS (Java/Others) 内存限制: 65536/32768 K (Java/Others) Special Judge: 无
问题描述
小仓鼠是武汉仓鼠大学(Wuhan Hamster University, WHU)的一名普通学生。仓鼠们 都特别喜欢喝奶茶,所以学校周边有很多诸如两点点,KoKo,茶千道之类的奶茶店。 武汉前段时间又经历了一波大降温,仓鼠们都被冷得瑟瑟发抖,不想出门,于是它们 决定点外卖。正如上面所说,外卖也有很多选择,这让小仓鼠们陷入了选择恐惧症。 仓鼠们都只喜欢某一种奶茶,这种奶茶有 n 家奶茶店有售,统一起见,一旦选定一家 奶茶店,仓鼠们的所有奶茶都会在这家奶茶店购买。对于某一家奶茶店,这种奶茶的售价 是 a 元,同时也会有一个满减活动(如满 20 减 5 元),格式为满 b 元减 c 元。此外,每一 单都会有一个外卖配送费,记为 d 元(满减针对的是商品价格总和,不含配送费)。 显然,一次性下单所有奶茶,可能不如分开成几批下单更便宜(这样可以凑更多的满 减),现在小仓鼠希望你帮忙计算一下买下 m 杯奶茶所需的最少的钱。 输入格式
第一行会有三个整数 n,m,d,表示共有 n 家奶茶店可选,需要购买 m 杯奶茶,配送费 为 d 元。 在接下来的 n 行,每行会有三个整数 ai,bi,ci。表示在第 i 家奶茶店,每杯奶茶价格为 ai 元,消费满 bi 元可以优惠 ci 元。保证 bi 是大于等于 ci 的。 数据中出现的所有数均为小于等于 3000 的正整数。
这道题有两个思路:
暴力和贪心,
能暴力是因为数据只有3000,两层大循环也顶得住,两层循环分别枚举在哪家奶茶店买以及下几单。
贪心思路:对于每家奶茶店,如果满减减掉的金额比配送费多,那么就每能凑满满减那么多份奶茶下一单,
否则就全下一单,多出来的零头分散到各个单中省掉多一单配送费。
代码:
#include <cstdio> int n,m,d; int Mincost=2147483645; int min(int a,int b){return a<b?a:b;} int main(){ scanf("%d%d%d",&n,&m,&d); for(int i=1;i<=n;i++){ int a,b,c,ans=0,count; scanf("%d%d%d",&a,&b,&c); ans+=a*m; if(ans<b){ ans+=d; continue; } if(c>d){ int temp=b%a==0?(b/a):(b/a+1); count=m/(temp); ans-=count*c; ans+=count*d; } else{ ans-=c; ans+=d; } Mincost=min(Mincost,ans); } printf("%d",Mincost); return 0; }
以上是关于whu新生赛:一道简单的贪心,然鹅我并不会做的主要内容,如果未能解决你的问题,请参考以下文章
Contest1593 - 2018-2019赛季多校联合新生训练赛第三场(部分题解)