Description:

Linda 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 Linda can get.

Input:

The input consists of two lines. The first gives the number of items Linda is buying, 1 ≤ n ≤ 100. The next line gives the prices of these items, 1 ≤ pi ≤ 1000.

Output:

Output one line giving the maximum discount Linda can get by selectively choosing which items she brings to the counter at the same time.

Sample Input:

6

400 100 200 350 300 250

Sample Output:

400


Hint:

No Hint


全英的题目而且挺长的,是不是有点害怕呢?其实只是背景资料有点多~~
将数字排好序后,问题就变得很简单了呢~分析示例:红色圈起来的是可以作为折扣的价钱
原例:
排好序后:
发现,题目中给出的示例刚好是三的倍数,考虑,要不是三的倍数呢?
假如为3k+1,一个示例如下图:
3k+2类似

考虑先用数组存储,再排序。
通过上述分析,我们会发现,只要排好序,折扣的价钱分三种情况讨论即可。
但我们会发现,无论n = 3k或者n = 3k + 1或者n = 3k + 2,都只需要输出a[0]+a[3]+...+a[3k]即可。

我的代码:

#include<stdio.h>
int main() {
int n, a[], i, t, min, pi = , j;
scanf("%d", &n);
for (i = ; i < n; i++) {
scanf("%d", &a[i]);
}
for (i = ; i < n-; i++) { // 对数组内的数进行排序~
min = i;
for (j = i + ; j < n; j++)
if (a[min] > a[j])
min = j;
if (min != i) {
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
if (n % == ) { // 分三类情况讨论(其实你们肯定发现了这没有必要。。。)
for (i = ; i < n; i += ) {
pi += a[i];
}
}
else if (n % == ) {
for (i = ; i < n; i += ) {
pi += a[i];
}
}
else if (n % == ) {
for (i = ; i < n; i += ) {
pi += a[i];
}
}
printf("%d\n", pi);
return ;
}

标答:

#include<stdio.h>
#include<stdlib.h> void Merge(int *R, int low, int m, int high);
void MergeSort(int R[], int low, int high); int main(void) {
int arr[], num, i, j, res = ; scanf("%d", &num);
for (i = ; i < num; i++) {
scanf("%d", &arr[i]);
} // sort the array with Merge Sort.
MergeSort(arr, , num - ); for (i = num - , j = ; i >= ; i--, j++) {
if ((j + )% == ) {
res += arr[i];
}
} printf("%d\n", res);
return ;
} void Merge(int *R, int low, int m, int high) {
int i = low, j = m + , p = ;
int *R1;
R1 = (int *)malloc((high - low + )*sizeof(i)); // 动态内存分配
if (!R1) return; while (i <= m && j <= high) {
R1[p++] = (R[i] <= R[j])?R[i++]:R[j++]; // a?b:c的含义是:当a为真时值为b,否则为c
} while (i <= m) {
R1[p++] = R[i++];
} while (j <= high) {
R1[p++] = R[j++];
} for (p = , i = low; i <= high; p++, i++) {
R[i] = R1[p];
} free(R1); // 用了malloc进行动态内存分配,当内存用完不再需要时需要将其释放
} void MergeSort(int R[], int low, int high) {
int mid;
if (low < high) {
mid = (low + high)/;
MergeSort(R, low, mid);
MergeSort(R, mid + , high);
Merge(R, low, mid, high);
}
}

给标答加了一些注释,标答效率较高,用了归并排序(有兴趣可以百度~)

看了标答发现分三种情况输出是完全没有必要的,思维不够灵活。。。

Maximal Discount的更多相关文章

  1. [LeetCode] Maximal Square 最大正方形

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  2. [LeetCode] Maximal Rectangle 最大矩形

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  3. 85. Maximal Rectangle

    85. Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle c ...

  4. 求解最大矩形面积 — leetcode 85. Maximal Rectangle

    之前切了道求解最大正方形的题,题解猛戳 这里.这道题 Maximal Rectangle 题意与之类似,但是解法完全不一样. 先来看这道题 Largest Rectangle in Histogram ...

  5. 求解最大正方形面积 — leetcode 221. Maximal Square

    本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结" ...

  6. type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object

    今天在进行代码检查的时候出现下面的异常: type parameters of <T>T cannot be determined; no unique maximal instance ...

  7. 【leetcode】Maximal Rectangle

    Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...

  8. [LintCode] Maximal Square 最大正方形

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  9. [LintCode] Maximal Rectangle 最大矩形

    Given a 2D boolean matrix filled with False and True, find the largest rectangle containing all True ...

随机推荐

  1. react native 中的ListView

    ListView 的运用: 1.首先在react native中引入这个组件: 2.初始化的ListView 的相关属性: constructor(props) { super(props); con ...

  2. POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19884   Accepted: 83 ...

  3. POJ2243 Knight Moves —— A*算法

    题目链接:http://poj.org/problem?id=2243 Knight Moves Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  4. COGS-2049 疯狂动物城

    Description 你意外来到了一个未知的星球, 这里是一个动物乌托邦, 生活着一群拥有非凡智力的动物. 你遇到了一个叫做尼克的狐狸, 他准备给他的 GF 过生日 . 他将制作一个巨大的多层蛋糕, ...

  5. 【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录

    原文发表于百度空间,2008-7-24 当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了======================================= ...

  6. DDK编写64位驱动时加入x64汇编的方法

    上篇讲了如何在编写x64应用程序时加入x64汇编,这里来说说如何在编写x64驱动时加入x64汇编. 一.在asm文件中单独编写功能函数 比如要实现一个64位的加法函数,原型如下: ULONG64 my ...

  7. Naïve Bayes Models

    贝叶斯模型假设: 为防止概率为零的情况,做拉普拉斯平滑得: 下面介绍一下朴素贝叶斯模型与多变量伯努利模型的区别: 朴素贝叶斯: 多变量伯努利: 即: 多变量伯努利模型不考虑样本出现的次数,每个特征的取 ...

  8. 任务41:Individual authentication 模板

    使用命令行创建项目 会自动加上ef core和Identity core代码的示例 默认创建mvc是不带Identity的 dotnet new -help:查看可用的命令: -au:Individu ...

  9. ORACLE PL/SQL 实例精解之第四章 条件控制:if 语句

    4.1 IF 语句 IF语句两种形式:IF-THEN IF-THEN-ELSE 使用IF-THEN,可以指定需要执行的一组动作. IF-THEN-ELSE语句指定两组动作 1. IF-THEN TRU ...

  10. E20180421-hm

    ambiguous  adj. 模棱两可; 含糊的,不明确的; 引起歧义的; 有两种或多种意思的; simple  adj. 简单的; 单纯的; 易受骗的; 天真的; simplify  vt. 简化 ...