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;
}

猜你喜欢

转载自www.cnblogs.com/Zarax/p/12014144.html