1438Shopaholic

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB

Description

Lindsay is a shopaholic. Whenever there is a discount of the kind where you can buy three items and only pay for two, she goes completely mad and feels a need to buy all items in the store. You have given up on curing her for this disease, but try to limit its effect on her wallet. You have realized that the stores coming with these offers are quite selective when it comes to which items you get for free; it is always the cheapest ones. As an example, when your friend comes to the counter with seven items, costing 400, 350, 300, 250, 200, 150, and 100 dollars, she will have to pay 1500 dollars. In this case she got a discount of 250 dollars. You realize that if she goes to the counter three times, she might get a bigger discount. E.g. if she goes with the items that costs 400, 300 and 250, she will get a discount of 250 the first round. The next round she brings the item that costs 150 giving no extra discount, but the third round she takes the last items that costs 350, 200 and 100 giving a discount of an additional 100 dollars, adding up to a total discount of 350. Your job is to find the maximum discount Lindsay can get.

Input

The first line of input gives the number of test scenarios, 1 ≤ t ≤ 20. Each scenario consists of two lines of input. The first gives the number of items Lindsay is buying, 1 ≤ n ≤ 20000. The next line gives the prices of these items, 1 ≤ pi ≤ 20000.

Output

For each scenario, output one line giving the maximum discount Lindsay can get by selectively choosing which items she brings to the counter at the same time.

题目解释:这道题主要是买3免1的活动。商家搞活动的时候,买3个物品的时候可以免最低价格的物品的单,在要购买的n件物品中,如何选择搭配实现获得最大的折扣。其实在这道题里面,觉得这道题很简单,因为只需要每次将最贵的3个搭在一起便可。也就是要获得最大的折扣,我们需要尽可能使面单的物品的价格最高。解题思路是对n件物品进行排序,从大到小,每隔3个取1个,这样就能获得最大价值了。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(const int &a, const int &b){
    return a > b;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    int t;
    cin >> t;
    while (t --) {
        int n;
        int max_discount = 0;
        vector<int>prices;
        cin >> n;
        for (int i = 0; i < n; i++) {
            int price;
            cin >> price;
            prices.push_back(price);
        }
        sort(prices.begin(), prices.end(),cmp);
        for (int i = 0; i < prices.size(); i++) {
            if((i+1)%3 == 0){
                max_discount += prices[i];
            }
        }
        cout << max_discount << endl;
    }
    return 0;
}


后记:

这道题用一个排序就可以解决,但是我想应该会有更好的算法实现,但是我没有想到。。。

你可能感兴趣的:(算法,sicily)