首页 > Cut
头像 HGDB
发表于 2020-06-06 10:23:09
思路 这题和POJ 3253很像,有兴趣可以去看看 可以试着反向思维考虑,将n个长度为1的序列合并成一个长度为n的序列,合并的代价就是合并前的两个序列之和 最佳的合并方法应该是尽可能多的合并长的木板,所以最优的策略应该是将目前所有序列中长度最大和次大的序列合并 不妨将原序列按降序排列,每次取出最大的 展开全文
头像 零壹博弈
发表于 2020-03-26 18:14:59
一开始看其实题目挺简单的,贪心策略很简单,只需要把得到的数组升序排列,然后分别算出第1项到第n项和,第2项到第n项,......第n-1项到第n项和,全部加起来。为什么呢?因为题目说的是获得最大的分割代价,而分割一次的代价是(剩余)原序列的和,那我们只需要让比较大的数多做贡献,就可以了,也就是说完成 展开全文
头像 白给怪
发表于 2020-06-02 14:07:46
题目地址:https://ac.nowcoder.com/acm/problem/14291思路:这道题是一道很明显的贪心题目,要使得代价最大,肯定是每次切割将最小的切掉,这样后续更大的数,在计算代价的时候会被多次累加,从而达到最大的目的。所以做法就是: 先排序,然后每次将最小的元素分割掉,这样总代 展开全文
头像 sunrise__sunrise
发表于 2020-06-03 07:40:12
贪心 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 给你一个长度为n的序列,你每次可以将一个序列分割成两个连续的的子序列, 分割的代价为原序列的总和。 现在允许你在初始 展开全文
头像 Eihuvita.
发表于 2020-06-08 15:57:04
题意 给你一个长度为n的序列,你每次可以将一个序列分割成两个连续的的子序列,分割的代价为原序列的总和。现在允许你在初始时将序列重新排列一次。问分割成n个长度为1的序列的最大总代价是多少? 输入描述 第一行一个数n表示原序列的长度;接下来一行n个数a_i表示原序列的第i个数。2<=n< 展开全文
头像 tin_t
发表于 2020-06-02 21:32:15
很明显这道题就是一道贪心,每次切那个数值最小的就行,所以可以用sort对输入进行排序,然后每次切割前加上还剩下的数值和,直到全部分割开。 #include<iostream> #include<queue> #include<algorithm> using n 展开全文
头像 DaMing
发表于 2020-06-02 10:14:51
因为我们要求总代价最大,所以大的数字我们要让他尽可能晚的从序列中分割出来,因为这样就可以在每次算代价的时候都加上这个大的数字,这样就会使最后的总代价最大代码 #include <map> #include <set> #include <cmath> #inclu 展开全文
头像 Dayline
发表于 2020-08-10 09:01:38
我也不知道咋想的 竟然用前缀和 其实直接写完全可以 最后的ans一定要开long long... #include <cstdio> #include <algorithm> using namespace std; const 展开全文
头像 李狗蛋儿
发表于 2020-06-02 17:52:45
示例中说明:[3,2,4,1]重排->[1,2,3,4]->[1],[2,3,4]->[1],[2],[3,4]->[1],[2],[3],[4]。所以用前缀和记录一下全部的值,在执行n-1次操作,每次减去除当前下标数组的所有值。 #include<iostream&g 展开全文
头像 昵称很长很长真是太好了
发表于 2020-06-02 22:05:09
题解:非常简单的一道贪心题目,题目想让你把一串子序列切割成长度为1的字串,每次切割的代价是被切割序列的总和,这样的话我们肯定是让序列中越大的数约往后切割,因为越大的数会对每次切割产生代价会越大,所以你是尽可能的想让这个数造成更大的代价,所以我们按照从小到大的顺序排序,之后从前往后切割就可以了。 #p 展开全文