ACDREAM 03D ACdream王国的花店(贪心专场)

来源:互联网 发布:mac上怎么玩英雄联盟 编辑:程序博客网 时间:2024/06/10 03:21

ACDREAM 03D ACdream王国的花店

Problem Description

ACdream王国的花店只有一家,所以大家想买花来装饰,店主为了防止有人恶意囤积鲜花来抬高物价(就是黄牛党啦~),于是就定下一个规矩:你买得越多,下一次买的单价就越贵!假设一个人已经购买了x朵鲜花,那么下一次购买第i朵鲜花的单价就是(x+1)*c[i],其中c[i]是一个店主为每一朵花的基本定价。

ACdream学校想开运动会,需要n朵鲜花来装饰,于是你和你的小伙伴总共m个人就得想办法花最少的钱去完成任务。请问机智的你最少需要花费多少钱呢?
Input

多组数据,每组数据首先是两个正整数,n(1<=n<=100),m(1<=m<=100)

然后是n个整数c[i],(1<=c[i]<=10^6)
Output
对于每组数据,输出一个整数,表示你需要花费的最少价格。
Sample Input

3 3
2 5 6
3 2
2 5 6

Sample Output

13
15

Hint

对于样例一,最优惠的方法就是3个人每人各买一朵,总花费2+5+6=13(元)

对于样例二,最优惠的方法是第一个人先购买第二朵,再购买第一朵,第二个人购买第三朵,总花费5+(1+1)*2+6=15(元)

解题思路:先每个人按从贵到便宜的顺序各买一朵,然后剩下的花价格变动,每个人再按从贵到便宜的顺序各买一朵,重复这样的操作,直到买完所有的花。

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long ll;int f[105];int main() {    int n, m;    while (scanf("%d %d", &n, &m) == 2) {        for (int i = 0; i < n; i++) {            scanf("%d", &f[i]);        }        if (n <= m) {            int sum = 0;            for (int i = 0; i < n; i++) {                sum += f[i];            }            printf("%d\n", sum);            continue;        }        sort(f, f + n);        int sum = 0;        int temp = 1;        while (n) {            for (int i = 0; i < m; i++) {                if (!n) break;                sum += f[--n] * temp;            }            temp++;        }        printf("%d\n", sum);    }    return 0;}
0 0
原创粉丝点击