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. IntelliJ IDEA 运行错误:java: Compilation failed: internal java compiler error

    错误:java: Compilation failed: internal java compiler error 解决的方法: 文件 --> 设置 : 若没有模块,点击右边的把自己项目的模块添 ...

  2. javascript中的_return_false和return_true

    1. [代码][JavaScript特效]代码     关于javascript中的 return false和return true 2008年12月22日 星期一 下午 09:31return 是 ...

  3. iOS字符串的各种用法(字符串插入、字符串覆盖、字符串截取、分割字符串)

    NSString* str=@"hello";//存在代码区,不可变 NSLog(@"%@",str); //1.[字符串插入] NSMutableString ...

  4. oracle 删除用户命令和部分表空间操作

    删除用户 drop user user_name cascade; 建立表空间 CREATE TABLESPACE data01DATAFILE '/oracle/oradata/db/DATA01. ...

  5. CentOS设置代理

      假设我们要设置代理为 IP:PORT1.网页上网网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->>Advanced--> ...

  6. [Selenium] IOS 之 appium

    从 Selenium 的官方文档来看,推荐用户使用 ios-driver 或 appium 而不是官方发布的 iPone Driver. 他们的地址分别是: http://ios-driver.git ...

  7. BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心

    BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心 Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C ...

  8. linux--多种包管理工具使用和区别(转)

    Linux包管理工具(转) 在正式进入讨论之前,先贴几条非常有用的link: linux 发行版比较:http://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1 ...

  9. Java中gcRoot和引用类型

    看到一个老问题,Java是如何判定回收哪些对象的? 答:从gcRoot根搜索不可达,且标记清理一次之后仍没有被复活的对象,会被认定为垃圾对象进行清理.注意在Java中没有对象的作用域,只有对象的引用的 ...

  10. robotframework:appium切换webview后,在webview里滑动屏幕

    问题: 在用robot写手机淘宝app的自动化时,打开手机淘宝后,点击天猫国际,跳转到天猫国际页面,天猫国际页面是H5, 需要切换到对应的webview,切换到webview后,点击美妆菜单,跳转到美 ...