1. 程式人生 > >【2018 CodeM】資格賽---下單

【2018 CodeM】資格賽---下單

前言

這道題目應該算簽到題了吧(我大概掃了一下,感覺這道題目應該是最簡單的 ^_^)

注:如果您現在還沒有AC,並且比賽還沒有結束,我建議再想想,認真再重新讀下題目描述,或許你就會發現原來是自己想複雜了(不管你是不是這樣的情形,反正我當時是這樣的,哈哈)

題目描述

[程式設計|1000分] 下單

時間限制:C/C++ 1秒,其他語言 2秒
空間限制:C/C++ 262144K,其他語言 524288K

題目描述

美團在吃喝玩樂等很多方面都給大家提供了便利。最近又增加了一項新業務:小象生鮮。這是新零售超市,你既可以線上下超市門店選購生鮮食品,也可以在手機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

題目分析

最開始拿到這道題目,讀了下題目,題意應該是很容易讀懂的,畢竟這樣的場景在現實生活中經常出現嘛(感覺這道題目命的很不錯呀 ^_^)

咋一看,我們如何進行選取哪些物品進行優惠?腦袋馬上就閃出DP(假裝心中一萬個DP)。

然後就開始認真做題了(傻了吧唧的)

做了一半,發現這題是真的難(自己太菜就太菜,還怪題目難,哼,就是這麼不講理)

想了下,真的難,難道是我題目理解錯誤了?(好像開竅了)

好吧,讓我們來畫重點了。

美團在吃喝玩樂等很多方面都給大家提供了便利。最近又增加了一項新業務:小象生鮮。這是新零售超市,你既可以線上下超市門店選購生鮮食品,也可以在手機App上下單,最快30分鐘就配送到家。
新店開張免不了大優惠。我們要在小象生鮮超市裡採購n個物品,每個物品價格為ai,有一些物品可以選擇八折優惠(稱為特價優惠)。
有m種滿減優惠方式,滿減優惠方式只有在所有物品都不選擇特價優惠時才能使用,且最多隻可以選擇最多一款。


每種滿減優惠描述為(bi,ci),即滿bi減ci(當消費>=bi時優惠ci)。
求要買齊這n個物品(必須一單買齊),至少需要多少錢(保留兩位小數)。

注意我標註的重點,然後再想想應該明白了

只能使用一種滿減,並且只能一單買完(我就是最開始以為可以使用多種滿減方案,發現這道題目是真的難)

AC程式碼

#include <bits/stdc++.h>
using namespace std;
int a[11][2];
int bc[11][2];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>a[i][0]>>a[i][1];
    }
    for(int i=0;i<m;i++){
        cin>>bc[i][0]>>bc[i][1];
    }
    double res = 0;     //結果
    double temp = 0;       //商品總額
    for(int i=0;i<n;i++){
        temp += a[i][0];
        if(a[i][1]){
            res += a[i][0] * 0.8;
        } else {
            res += a[i][0];
        }
    }
    for(int i=0;i<m;i++){       //遍歷選擇最優的滿減
        if(temp >= bc[i][0]){
            if(temp-bc[i][1] < res){
                res = temp-bc[i][1];
            }
        }
    }
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<res<<endl;
    return 0;
}

注: 如有錯誤之處,還望指正,謝謝。歡迎dalao留言評論