贪心——Cut

贪心——Cut

题目描述

给你一个长度为n的序列,你每次可以将一个序列分割成两个连续的的子序列,
分割的代价为原序列的总和。
现在允许你在初始时将序列重新排列一次。
问分割成n个长度为1的序列的最大总代价是多少?

输入描述:

第一行一个数n表示原序列的长度;
接下来一行n个数a_i表示原序列的第i个数。
2<=n<=100000
0<=a_i<=10000

输出描述:

一行一个整数表示答案。

示例1

输入

4
3 2 4 1

输出

26

说明

[3,2,4,1]重排->[1,2,3,4]->[1],[2,3,4]->[1],[2],[3,4]->[1],[2],[3],[4]。

示例2

输入

4
1 1 1 1

输出

9

分析

这题比较简单,但是要注意要用long long来表示总数,不能用int,也不能使用二重循环,会超时。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,a[100005];
    cin>>n;
    long long sum=0,ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sort(a+1,a+n+1);
    ans=sum;
    sum=sum-a[1];
    for(int i=2;i<n;i++){
        ans+=sum;
        sum=sum-a[i];
    }
    cout<<ans<<endl;
    return 0;
}
### 使用贪心算法解决钢条切割问题 #### 钢条切割问题概述 给定一段长度为 `n` 的钢条和价格表 `p[i]` 表示长度为 `i` 的钢条的价格,目标是通过切割钢条成多段来最大化总收益。 #### 贪心策略选择 对于钢条切割问题,贪心算法并不是一种能够保证全局最优解的方法。这是因为该问题通常不具备无后效性的特性——即后续决策可能会影响之前的决策效果[^1]。然而,为了展示如何应用贪心方法尝试解决问题,可以采取如下策略: - **最大单价优先**:始终选择单位长度价值最高的那一部分作为切分方案的一部分。 这种简单的贪心策略并不一定能找到最佳解法,但在某些情况下可能会给出接近最优的结果。 #### Python 实现代码 下面是一个基于上述贪心思想的Python程序实现: ```python def greedy_rod_cutting(prices, n): # 初始化每单位长度的价值列表 unit_prices = [(length, price / length) for length, price in enumerate(prices, start=1)] # 按照单位长度价值降序排列 sorted_unit_prices = sorted(unit_prices, key=lambda x: x[1], reverse=True) total_profit = 0 remaining_length = n result = [] for length, _ in sorted_unit_prices: if remaining_length >= length: count = remaining_length // length total_profit += prices[length - 1] * count remaining_length -= length * count result.append((length, count)) if remaining_length == 0: break return total_profit, result # 测试据集 prices = [1, 5, 8, 9, 10, 17, 17, 20] n = 8 profit, cuts = greedy_rod_cutting(prices, n) print(f"Total Profit: {profit}") for cut in cuts: print(f"Cuts of size {cut[0]} made {cut[1]} times.") ``` 这段代码实现了按照单位长度价值排序并尽可能多地选取最高价值片段的方式来进行切割操作。需要注意的是这种方法并不能保证获得真正的最优解;它只是一个近似解的例子。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值