题目链接:http://39.108.226.55/problem/201802287
Description
这一关兔小灰需要将一根长的木棒切成N段。每段的长度分别为L1,L2,......,LN(1 <= L1,L2,…,LN <= 1000,且均为整数)个长度单位。我们认为切割时仅在整数点处切且没有木材损失。
然而兔小灰发现,每一次切割花费的体力与该木棒的长度成正比,不妨设切割长度为1的木棒花费1单位体力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,则木棒原长为12,木匠可以有多种切法,如:先将12切成3+9.,花费12体力,再将9切成4+5,花费9体力,一共花费21体力;还可以先将12切成4+8,花费12体力,再将8切成3+5,花费8体力,一共花费20体力。显然,后者比前者更省体力。那么,兔小灰至少要花费多少体力才能完成切割任务呢?
Input
第1行:1个整数N(2 <= N <= 500)第2 - N + 1行:每行1个整数Li(1 <= Li <= 1000)。
Output
输出最小的体力消耗。
Sample Input 1
3
3
4
5
Sample Output 1
19
看到了大佬的写题思路,用的优先队列,去学了一波。。在学的时候突然想到不用优先队列也可以过,模拟优先队列,
题意很明确,我们给他换一个角度解决,切不确定就接,把这些散的木棒结成一个大木棒,用的最少力气,好了,那么我们只用每次着最小的两个木棒就行了,给他结成一个大的木棒再次寻找,就解决了,这个是,n*log(n)的方法,感觉还是可以的:
ac:
#include
#include
#include
//#include
然后是优先队列的,上面的那个感觉还是这道题太简单,没什么其他的变量什么的,但是还是要学一下优先队列的:
优先队列的详细讲解有一个链接:http://blog.csdn.net/c20182030/article/details/70757660。
注意优先队列的使用格式:
struct node{
int first,secend;
};
struct cmp{
bool operator()(const node &a,const node &b){
return a.first>b.first;//这个规则是first小的排在前面
}
};
priority_queue,cmp> que;
//-----优先队列默认的排列顺序
/*
priority_queue que;
从大到小:
input:
1 2 3 4 5 6 7 8 9
output:
9 8 7 6 5 4 3 2 1
*/
当然,wo'm我们也可以直接定义结构体内部的排序规则,然后直接使用普通的优先队列,例:
//x大的是大的结构体
struct node{
int x,l;
//重载大于号
bool operator < (const node & a)const{
return xa.x;
}
};
这样就能实现priority_queue
的排序了
less //从大到小
greater //从小到大
#include
#include
#include
//#include