九度oj 题目1107:搬水果
- 题目描述:
-
在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时总共消耗的体力等于每次合并所耗体力之和。
假定每个水果重量都为 1,并且已知水果的种类数和每种水果的数目,你的任务是设计出合并的次序方案,使小明耗费的体力最少,并输出这个最小的体力耗费值。例如有 3 种水果,数目依次为 1,2,9。可以先将 1,2 堆合并,新堆数目为3,耗费体力为 3。然后将新堆与原先的第三堆合并得到新的堆,耗费体力为 12。所以小明总共耗费体力=3+12=15,可以证明 15 为最小的体力耗费值。
- 输入:
-
每组数据输入包括两行,第一行是一个整数 n(1<=n<=10000),表示水果的种类数,如果 n 等于 0 表示输入结束,且不用处理。第二行包含 n 个整数,用空格分隔,第 i 个整数(1<=ai<=1000)是第 i 种水果的数目。
- 输出:
-
对于每组输入,输出一个整数并换行,这个值也就是最小的体力耗费值。输入数据保证这个值小于 2^31。
- 样例输入:
-
3
9 1 2
0
- 样例输出:
-
15 题目其实是构成一个哈夫曼树,超时了好几次
第一次代码:#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> #define MAX 20002
int fruit[MAX];
int flag[MAX]; int main(int argc, char const *argv[])
{
int n;
freopen("input.txt","r",stdin);
scanf("%d",&n);
while(n != ) {
for(int i = ; i < n; i++) {
scanf("%d",&fruit[i]);
}
int ans = ;
int cnt = n;
memset(flag, , sizeof(flag)); for(int i = ; i < n-; i++) {
int min = , minj = -;
int min2 = , min2j = -;
for(int j = ; j < cnt; j++) {
if(flag[j] == && fruit[j] < min) {
min2 = min;
min2j = minj;
min = fruit[j];
minj = j;
}
else if(flag[j] == ){
if(fruit[j] < min2) {
min2 = fruit[j];
min2j = j;
}
}
}
int temp = ;
if(minj != -) {
flag[minj] = ;
temp = temp + min;
}
if(min2j != -) {
flag[min2j] = ;
temp = temp + min2;
}
fruit[cnt++] = temp;
ans = ans + temp;
}
printf("%d\n",ans);
scanf("%d",&n);
}
return ;
}第二次代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> #define MAX 20002
int fruit[MAX]; void buble2sort(int start, int end) {
int min = fruit[end];
int mini = end;
for(int i = end-; i >= start ; i--) {
if(fruit[i] < min) {
min = fruit[i];
mini = i;
}
}
int temp = fruit[start];
fruit[start] = min;
fruit[mini] = temp; min = fruit[end];
mini = end;
for(int i = end - ; i >= start+ ; i--) {
if(fruit[i] < min) {
min = fruit[i];
mini = i;
}
}
temp = fruit[start+];
fruit[start+] = min;
fruit[mini] = temp;
} int main(int argc, char const *argv[])
{
int n;
freopen("input.txt","r",stdin);
scanf("%d",&n);
while(n != ) {
int ans = ; for(int i = ; i < n; i++) {
scanf("%d",&fruit[i]);
} int cnt = ;
int end = n;
for(int i = ; i < n-; i++) {
buble2sort(cnt,end-);
fruit[end] = fruit[cnt] + fruit[cnt+];
ans = ans + fruit[end];
cnt = cnt + ;
end++;
} printf("%d\n",ans); scanf("%d",&n);
}
return ;
}
九度oj 题目1107:搬水果的更多相关文章
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- Android Studio项目上传到Jcenter
一.将你要发布的moudle的build.gradle中添加代码,gradle的最后添加 PUBLISH_GROUP_ID = 'com.zzti.fengyongge' PUBLISH_ARTIFA ...
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...
- nGrinder技术架构图
- 使用Google Colab训练神经网络(二)
Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.Colaborat ...
- feature map计算大小公式
http://blog.csdn.net/cheese_pop/article/details/51955915 将整个分成两部分,左边部分,右边部分.右边部分每次其实都是移动stride这么大,左边 ...
- Qt+事件的接收和忽略
事件的接收与忽略的示意图如下图: 依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制.在一个特殊的情形下,我们必须使用accept()和ignore( ...
- [BZOJ4899]:记忆的轮廓(概率DP)
题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- Java创建图片文件缩略图
public static void uploadImg(InputStream file, String filePath, String fileName, int widthdist, int ...
- [九省联考2018] IIIDX 线段树+贪心
题目: 给出 k 和 n 个数,构造一个序列使得 d[i]>=d[i/k] ,并且字典序最大. 分析: 听说,当年省选的时候,这道题挡住了大批的高手,看上去十分简单,实际上那道弯段时间内是转不过 ...
- UVa-232-纵横字谜的答案
这一题的话,输出的时候,我们要按照3位输出,不能按照两位,因为是10*10的网格,所以就是100位,不管有没有100的起始格,它都是按照3位进行输出的,从题上的输出可以看到,不然的话,就会PE. 然后 ...