Maximal Discount
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



我的代码:
#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的更多相关文章
- [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 ...
- [LeetCode] Maximal Rectangle 最大矩形
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- 85. Maximal Rectangle
85. Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle c ...
- 求解最大矩形面积 — leetcode 85. Maximal Rectangle
之前切了道求解最大正方形的题,题解猛戳 这里.这道题 Maximal Rectangle 题意与之类似,但是解法完全不一样. 先来看这道题 Largest Rectangle in Histogram ...
- 求解最大正方形面积 — leetcode 221. Maximal Square
本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 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 ...
- 【leetcode】Maximal Rectangle
Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...
- [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 ...
- [LintCode] Maximal Rectangle 最大矩形
Given a 2D boolean matrix filled with False and True, find the largest rectangle containing all True ...
随机推荐
- noi2014魔法森林
为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含
- POJ2752 Seek the Name, Seek the Fame —— KMP next数组
题目链接:https://vjudge.net/problem/POJ-2752 Seek the Name, Seek the Fame Time Limit: 2000MS Memory Li ...
- codeforces 433C. Ryouko's Memory Note 解题报告
题目链接:http://codeforces.com/problemset/problem/433/C 题目意思:一本书有 n 页,每页的编号依次从 1 到 n 编排.如果从页 x 翻到页 y,那么| ...
- oracle 删除用户命令和部分表空间操作
删除用户 drop user user_name cascade; 建立表空间 CREATE TABLESPACE data01DATAFILE '/oracle/oradata/db/DATA01. ...
- 【转载】Android Studio简单设置
界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings --> Appearance --> Theme ,选择 Darcula 主题即可 ...
- ss连接不上
突然ss就连接不上了,而vps的ip能ping通,ssh也能登录. 折腾了半天都没解决. 后来解决了,关键点有两个 (1)更改ss的服务端口,原本是9000,随便改为其他的: (2)在switch里设 ...
- Perl解析JSON数据精解
简介:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Dece ...
- iOS 深拷贝、浅拷贝、自定义对象拷贝简介
copy语法的目的:改变副本的时候,不会影响到源对象: 深拷贝:内容拷贝,会产生新的对象.新对象计数器置为1,源对象计数器不变. 浅拷贝:指针拷贝,不会产生新的对象.源对象计数器+1. 拷贝有下面两个 ...
- printf(“%06d\n”,x);
%06d : %是格式化输入接受参数的标记 0格式化命令:结果将用零来填充 6:填充位数 d:代表十进制 数据 printf(“%06d\n”,x); console: 000001 000002 0 ...
- 004--linux命令tar 软硬链接
一.tar命令介绍: -c:创建一个新的tar文件 -t:列出tar文件中目录的内容 -x:从tar文件中抽取文件 -f:指定归档文件或磁带(也可能是软盘)设备(一般都要选) -v:显示所打包的文件的 ...