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);
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章