数组-排序-邮票组合
2012-11-11 09:22
120 查看
【题】
背景:
我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。
现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。
输入:
四种邮票的面值。
输出:
用这四种面值组成的邮资最大的从1开始的一个连续的区间。
说明:
如结果为10,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。
名词解释:
邮资:就是你寄东西需要花多少钱。
邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。
如果你寄东西,邮局称了重量,告诉你要240分。这样你就要贴邮票了。如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。显然不同邮票的组合都可以得到同样一种邮资。
【分析】
(1)首先要找出四种邮票组合出的不同的面值,用数组存起来。
(2)然后,找出从1开始的一个连续的区间。怎么找呢?对面值进行从小到大排序。这样就能很明显得发现,哪里不连续了。
【代码】
邮票组合(选作)
背景:我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。
现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。
输入:
四种邮票的面值。
输出:
用这四种面值组成的邮资最大的从1开始的一个连续的区间。
说明:
如结果为10,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。
名词解释:
邮资:就是你寄东西需要花多少钱。
邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。
如果你寄东西,邮局称了重量,告诉你要240分。这样你就要贴邮票了。如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。显然不同邮票的组合都可以得到同样一种邮资。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 2 | 以文本方式显示 1 3 7 12↵ | 以文本方式显示 The max is 46.↵ | 1秒 | 64M | 0 |
(1)首先要找出四种邮票组合出的不同的面值,用数组存起来。
(2)然后,找出从1开始的一个连续的区间。怎么找呢?对面值进行从小到大排序。这样就能很明显得发现,哪里不连续了。
【代码】
#include "stdio.h" int main(int argc, char **argv) { int i, j, k, r, t; int a=1, b=3, c=7, d=12; int sum, arr[10000], count = 0, flag; //保存数的各个位 arr[0] = 0; scanf("%d %d %d %d", &a, &b, &c, &d); getchar(); //找出所有不同是组合 for (i = 0; i <= 5; i++) { for (j = 0; j <= 5; j++) { for (k = 0; k <= 5; k++) { for (r = 0; r <= 5; r++) { if (i + j + k + r > 5) //邮票一共最多5张 { continue; } sum = a * i + b * j + c * k + d * r; //组合出的邮票面值 flag = 0; for (t = 0; t <= count; t++) //检查这种面值是否出现过。其实这一步可以省略掉,然后在找连续区间时进行适当的处理也行 { if (sum == arr[t]) { flag = 1; break; } } if (!flag) { count++; arr[count] = sum; } } } } } printf("\n组合出的所有不同的邮票面值:\n"); for (i = 1; i <= count; i++) { printf("%4d", arr[i]); if (i % 10 == 0) printf("\n"); } int temp; //冒泡排序,产生连续的值 for (i = 1; i <= count; i++) { for (j = count; j > i; j--) { if (arr[j] < arr[j-1]) { temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } } } printf("\n\n排序后的所有不同的邮票面值:\n"); for (i = 1; i <= count; i++) { printf("%4d", arr[i]); if (i % 10 == 0) printf("\n"); } printf("\n"); //找出从1开始的连续区间 for (i = 1; i <= count; i++) { if (arr[i] != i) { break; } } printf("The max is %d.\n", i-1); return 0; }
相关文章推荐
- PHP 两个多维数组根据某个键的值进行组合排序的几种思路
- 练习LINQ:同时操作二维和一维数组,把二维数组转为一维,计算一维和二维值,字符串组合,计算数组和,数组筛选,排序
- 数组排序组合最小数字
- 【 Algorithm】排序数组中查找和为n的一对数和所有组合
- PHP 两个多维数组根据某个键的值进行组合排序的几种思路(二)
- java 数组中两两相加等于某个数的组合种数 蛮力解法 排序解法
- 将数组去重组合、排序
- Python 排列组合以及多维数组排序
- iOS_字典数组 按key分组和排序
- C语言,有一个已排好的数组,要求输入一个数组后,按原来的排序规律将它插入数组
- C++中利用数组对字符进行除重和排序
- Python之Matplotlib 解决绘图 X 轴值不按数组排序问题.
- 有一个整数数组(包括正数 负数 和0),给定一个M值,要求数组中的一个或多个值相加的和等于M,有多少种组合?
- 【array】Android排序数组的简单方法
- 【后缀数组】uoj#35. 后缀排序
- 编写冒泡排序,可以排序整形数组,也可以排序字符串
- 数组排序总结(冒泡,选择,插入,希尔)
- 数字在排序数组中出现的次数
- javascript 对象数组根据对象object key的值排序
- 数字在排序数组中出现的次数