2018美团CodeM编程大赛资格赛第一题

一、问题描述

题目描述

美团在吃喝玩乐等很多方面都给大家提供了便利。最近又增加了一项新业务:小象生鲜。这是新零售超市,你既可以在线下超市门店选购生鲜食品,也可以在手机App上下单,最快30分钟就配送到家。
新店开张免不了大优惠。我们要在小象生鲜超市里采购n个物品,每个物品价格为ai,有一些物品可以选择八折优惠(称为特价优惠)。
有m种满减优惠方式,满减优惠方式只有在所有物品都不选择特价优惠时才能使用,且最多只可以选择最多一款。
每种满减优惠描述为(bi,ci),即满bi减ci(当消费>=bi时优惠ci)。
求要买齐这n个物品(必须一单买齐),至少需要多少钱(保留两位小数)。

输入描述:

第一行,两个整数n,m
接下来n行,每行一个正整数ai,以及一个0/1表示是否可以选择特价优惠(1表示可以)。
接下来m行,每行两个正整数bi,ci,描述一款满减优惠。
1 <= n,m <=10
1 <= ai <= 100
1 <= ci < bi <= 1000

输出描述:

一行一个实数,表示至少需要消耗的钱数(保留恰好两位小数)。

示例1

输入

2 1
6 1
10 1
12 2

输出

12.80

示例2

输入

2 2
6 1
10 1
5 1
16 6

输出

10.00

二、解决思路

首先根据题意可知,有两种商品,一种是有8折优惠的商品,一种是没有优惠的商品,当选择8折时候就不能选择满减,反之一样。并且只能一次性购买所有的商品。那么当输入的时候我们就可以将两种商品分开,可以打折为一种,不可以为一种。商品分开完成后,我们要输入满减优惠,在输入的情况下,我们直接判断bi是否小于商品价值总数,当商品价值大于bi时我们继续判断,这个优惠是否为最大优惠力度,如果是将减钱数赋给max。最终比价两种策略那种更划算,输出结果

三、程序代码

#include<stdio.h>
int main(){
    int a,b,a1 = 0,a0 = 0,i,j,max = 0;
    double sum;
    int n,m;
    scanf("%d %d",&n,&m);
    for(i = 0;i < n ;i++){
        scanf("%d %d",&a,&b);
        if(b){
            a1+=a;
        }else{
            a0+=a;
        }
    } 
    for(i = 0;i < m ;i++){
        scanf("%d %d",&a,&b);
        if(a<=a0+a1){
            if(b>max){
                max = b;
            }
        }
    } 
    if(max > a1*0.2){
        sum = a0+a1-max;
    }else{
        sum = a0+0.8*a1;
    }
    printf("%.2f",sum);
} 

猜你喜欢

转载自blog.csdn.net/qq_39159168/article/details/80625880