九度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,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- 访问者模式和php实现
访问者模式: 表示作用于某个对象结构中的各个元素的操作.它使你可以在不改变各个元素类的前提下定义作用于这些元素的操作. 角色: 1)抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口.该操作接 ...
- 【js】数组去重时间复杂度为n的方法
# 时间复杂度O(n^2) function fn(arr) { return arr.filter((item, index, arr) => arr.indexOf(item) === in ...
- C语言abs函数
C语言编程入门教程 - abs 函数是用来求整数的绝对值的. //函数名:abs //功 能:求整数的绝对值 //用 法:int abs(int i); //程序例: #include<stdi ...
- jmeter中通过jdbc方式连接mysql数据库的配置参考
jmeter中通过jdbc方式连接mysql数据库的配置参考: Database URL=jdbc:mysql://ip:port/dbname?useUnicode=true&allowMu ...
- EJB2.0教程 详解EJB技术及实现原理
EJB是什么呢?EJB是一个J2EE体系中的组件.再简单的说它是一个能够远程调用的javaBean.它同普通的javaBean有两点不同.第一点,就是远程调用.第二点,就是事务的功能,我们在EJB中声 ...
- Ubuntu下Postgres安装与配置
postgres8.4安装配置:1.安装postgres8.4~$ sudo apt-get install postgresql 2.修改超级管理员postgres密码:以系统用户运行psql~$ ...
- HITICS || 2018大作业 程序人生 Hello's P2P
摘 要 本文通过分析一个hello.c的完整的生命周期,从它开始被编译,到被汇编.链接.在进程中运行,讲解了Linux计算机系统执行一个程序的完整过程. 关键词:操作系统,进程,程序的生命周期 目 ...
- linux环境nginx的安装与使用
因为公司需要需要安装一系列环境,新手上路第一次配的时候什么也不懂在网上找了半天,觉得这篇不错,我在这里顺便记录一下.(原文:https://www.cnblogs.com/wyd168/p/66365 ...
- 欧拉函数φ(x)简要介绍及c++实现
我还是很喜欢数论,从此吃喝不问,就此沉沦. 欧拉函数φ(x)的值为在[1,x)的区间内与x互质的数的个数 通式: 其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)=1. 注意 ...
- 【Office_Word】Word排版
文档排版的步骤: step1.先设置正文的样式 step2.再设置各级标题的样式 step3.最后在"多级列表"里设置各级标题编号 [注]最好按照这三步的顺序来排版,否则将会导致正 ...