合并果子(NOIP2004)
合并果子(NOIP2004)
【问题描述】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了
不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子
合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过
n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次
合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省
体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,
你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的
体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将 1、2堆合并,新堆数目为3,
耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,
耗费体力为 12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力
耗费值。
【输入文件】
输入文件fruit.in包括两行,
第一行是一个整数n(1 <= n <= 10000),表示果子的种类数。
第二行包含n个整数,用空格分隔,第i个整数ai(1 <= ai <= 20000)
是第i种果子的数目。
【输出文件】
输出文件fruit.out包括一行,
这一行只包含一个整数,也就是最小的体力耗费值。
输入数据保证这个值小于231。
【样例输入】
3
1 2 9
【样例输出】
15
【数据规模】
对于30%的数据,保证有n <= 1000;
对于50%的数据,保证有n <= 5000;
对于全部的数据,保证有n <= 10000。
分析:
咋一看,觉得此题目和经典的石子合并很相似,其实不然,石子的合并必须是相邻的2堆,要按照一定得顺序进行合并,而果子合并则不需要是相邻的,可以采取以下的步骤进行合并:
(1)先将所有的数按从大到小的顺序排序,取最后两个数合并;(之所以从大到小排列,是为了方便后面的数组维护)
(2)将两个数的和插入到数组中,(插入排序)随时保持数组有序;(如果在整理数组的时候仍然调用快速排序,则速度会降慢,因为此时的数组是有序的,只需要将合并后的数放入到有序数组的适当位置,使用插入排序更合适。)
(3)合并过程中做数组维护,合并到一堆时结束。
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return *(int *)b- *(int *)a;
}
int main()
{
int n,*a;
int i;
int sum,temp,j;
freopen("fruit1.in","r",stdin);
freopen("fruit1.txt","w",stdout);
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
;i<n;i++)
{
scanf("%d",a+i);
}
//将所有堆果子按数量从大到小排序
qsort(a,n,sizeof(int),cmp);
//从后往前扫描,每一次合并得到一个新的值temp后,把temp累加到sum
//然后把temp插入到数组合适的位置
//重复上述过程n-1次,最后sum的值就是所求答案
sum=;
;i>;i--)
{
temp=a[i]+a[i-];
sum+=temp;
;j>=;j--)
{
if(temp>a[j])
{
a[j+]=a[j];
}
else
{
a[j+]=temp;
break;
}
}
) a[]=temp;
}
printf("%d\n",sum);
free(a);
;
}
合并果子(NOIP2004)的更多相关文章
- 加强版:合并果子[NOIP2004]
题目 链接:https://ac.nowcoder.com/acm/contest/26887/1001 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...
- NC16663 [NOIP2004]合并果子
NC16663 [NOIP2004]合并果子 题目 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可 ...
- NOIP2004合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- [luoguP1090][Noip2004]合并果子
合并果子 首先来看一下题目: (OI2004合并果子) [题目描述] 果园里,多多已经将所有的果子打了下来,而且按果子的 ...
- [Noip2004][Day ?][T?]合并果子(?.cpp)
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- [NOIP2004] 提高组 洛谷P1090 合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 合并果子 (codevs 1063) 题解
[问题描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和 ...
- 代码源 每日一题 分割 洛谷 P6033合并果子
题目链接:切割 - 题目 - Daimayuan Online Judge 数据加强版链接: [NOIP2004 提高组] 合并果子 加强版 - 洛谷 题目描述 有一个长度为 ∑ai 的木板,需要 ...
- 【noip 2004】 合并果子
noip2016结束后的第一份代码--优先队列的练习 合并果子 原题在这里 #include <iostream> #include <queue> #include < ...
随机推荐
- C C++ 去除 unused的提示
C C++ 去除 unused的提示 #define UNUSED(VAR) {VAR++;VAR--;} unsigned int user_id=0; UNUSED(user_id); 这样就可以 ...
- Java学习笔记——IO操作之以图片地址下载图片
以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...
- ENC28J60学习笔记——第1部分
1前言 嵌入式以太网开发,可以分为两个部分,一个是以太网收发芯片的使用,一个是嵌入式以太网协议栈的实现.以太网收发芯片的使用要比串口收发芯片的使用复杂的多,市面上流通比较广泛的以太网收发芯片种类还不少 ...
- windows的磁盘操作之四——根据逻辑分区号获得物理磁盘号(转)
第一节中我们谈到了磁盘设备名称的两种形式: 对于物理驱动器x,形式为\\.\PhysicalDriveX,编号从0开始,例如 名称 含义 \\.\PhysicalDrive0 打开第一个物理驱动器 \ ...
- "Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased."
用一个普通的域帐号玩私有云的时候,遇到了如下的报错. "Your computer could not be joined to the domain. You have exceeded ...
- 从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现
http://blog.csdn.net/dark_scope/article/details/17228643 〇.说明 本文的所有代码均可在 DML 找到,欢迎点星星. 一.引入 推荐系统(主要是 ...
- [React] Write a stateful Component with the React useState Hook and TypeScript
Here we refactor a React TypeScript class component to a function component with a useState hook and ...
- maven 下载源码downloadsources
mvn eclipse:eclipse -Ddownloadsources=true -Ddownloadjavadocs=true
- js undefined易错分析
undefined 以下是错误写法: data = undefined; alert(undefined==false);//这样判断会输出false; if(data!=undefined || d ...
- android中去掉ListView控件中的分割线
通过设置android:divider="@null" ,可以去掉ListView控件中的分割线 也可以自定义分割线的颜色,比如: <ListView android:id= ...