题意 : 有n块土地,每块有A[i]泥土,现把其改造成B[i]泥土,有3种操作:(1)花费X向任意土地增加1泥土;(2)花费Y向任意土地减少1泥土;(3)花费Z*|i-j|把土地i的1泥土运到土地j。问最小花费是多少。

分析 :

参考了洛谷大神们给出的思路,下面简述一下

简单的讲就是对于每一个点,先将其花费一定的价值使得其数量

变成 B[i] 泥土,但是这个花费不一定是最优的,可以通过后期调整

来达到使得花费更小,调整的方案当然就是对于改变前后缺少和

改变前后增加这两种土地来进行考虑,对于缺少的土地,可以考虑

直接花费 X 的代价去买土地,也可以考虑从先前改变前后增加的土

地花费 Z 转移过来。对于改变前后增加的土地,也是差不多的情况

先定义 opt(x) 代表当前点暂时的最优取值,即最小花费

举个例子,若当前第一个点是改变前后缺少的,那么由于还没有枚举到

改变前后增加的点,所以只能通过花费 X 的方案来使得其改变前后相等

即 opt(first_point) = (B[first_point] - A[first_point])*X ==> 当然,这只是暂时的

for( 按照下标从小到到大枚举每一个点 ) :

  若当前改变前后的土地差值不变 continue

  若当前改变前后土地是缺少的 :

    假设当前点是 j ,且之前有 i1、i2、i3…… 是改变前后增加的

    若选择通过从从这些 i 来转移到 j 使得改变前后相等

    则有 (j-i1)*Z - opt(i1)、(j-i2)*Z - opt(i2)、(j-i3)*Z - opt(i3)…… 当然要从这些取最小

    考虑一下为什么是样子,因为是从 i 转移而来,所以之前 i 产生的最优花费,我们应当是要减掉的

      以此来抵消掉之前 i 的花费,使得其转移到 j 这里来,产生更加优秀的方案,不理解就往下看

    简化一下有 j*Z - max[i + opt(i)] ==> 从那么多个 i 中取最大的,才能保证花费最小

    故最后 opt(j) = min( X,  j*Z - max[i + opt(i)] ) ==> 当然还要和直接购买这种方案取一个 min

  若改变前后土地是增加的 : 

    和缺少的情况很像,就不阐述了

   ans += opt(j)

上面就是 伪代码思路 这个贪心显而易见是正确的,不断从多种方式取最优

这种贪心思路很容易想到,就是不知道怎么去用代码写出来,或者没有一个清晰的思路

这种先确定一个值,后面再去调整取更优的贪心思路,学习一下

至于DP的思路,其实我没看过,有空再说

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL N, X, Y, Z;
priority_queue<LL> opt_lack;///表示每一个缺少点的最优取值
priority_queue<LL> opt_surplus;///表示每一个多余点的最优取值

int main(void)
{
    while(~scanf("%lld %lld %lld %lld", &N, &X, &Y, &Z)){

        while(!opt_lack.empty()) opt_lack.pop();
        while(!opt_surplus.empty()) opt_surplus.pop();

        LL before, after, ans = ;
        ; j<=N; j++){
            scanf("%lld %lld", &before, &after);
            if(before == after) continue;
            if(before < after){
                ; i<=after-before; i++){
                    if(opt_surplus.empty() || j*Z - opt_surplus.top() >= X){
                        ans += X;
                        opt_lack.push(j*Z+X);
                    }else{
                        LL T = opt_surplus.top(); opt_surplus.pop();
                        ans += j*Z - T;
                        opt_lack.push(j*Z + j*Z - T);
                    }
                }
            }else{
                ; i<=before-after; i++){
                    if(opt_lack.empty() || j*Z - opt_lack.top() >= Y){
                        ans += Y;
                        opt_surplus.push(j*Z+Y);
                    }else{
                        LL T = opt_lack.top(); opt_lack.pop();
                        ans += j*Z - T;
                        opt_surplus.push(j*Z + j*Z - T);
                    }
                }
            }
        }

        printf("%lld\n", ans);
    }
    ;
}

洛谷 P3049 Landscaping ( 贪心 || DP)的更多相关文章

  1. 洛谷1417 烹调方案 dp 贪心

    洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...

  2. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  3. NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...

  4. 洛谷P1244 青蛙过河 DP/思路

    又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...

  5. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  6. 洛谷P1140 相似基因 (DP)

    洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...

  7. 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]

    题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...

  8. 洛谷1387 二维dp 不是特别简略的题解 智商题

    洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...

  9. 洛谷 P2657 (数位DP)

    ### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...

随机推荐

  1. 关于Tomcat配置问题

    一,部署并启动Tomcat服务器 Tomcat: 开源的 Servlet 容器. 解压 apache-tomcat-6.0.16.zip 到一个非中文目录下 配置一个环境变量. java_home(指 ...

  2. Solrcloud单机伪集群部署

    线上有一套双节点的Solrcloud节点,因机器性能较老,环境搭建于2013年,原节点有数百个已经被unload的collections,考虑以后可能还会需要,所以搭建一套和原节点相同的solrclo ...

  3. Linux学习笔记(14)linux在6.x和7.x系列的安装与基本使用区别

    关键词,centos7 centos6.x安装与使用:https://www.cnblogs.com/gered/p/9440551.html centos7.x安装与使用(本文)转自:https:/ ...

  4. MySQL -3- 基础应用

    1.数值类型 TINYINT --极小整数SMALLINT --较小整数MEDIUMINT --中型整数INT --常规整数BIGINT --较大整数FLOAT --小型单精度DOUBLE --常规双 ...

  5. ORA-01406:提取的列值被截断 ; SQL Server :将截断字符串或二进制数据

    oracle 数据库可以正常连接,表数据也可以正常读取, 但在程序中相同的位置,有时会报错,有时不会报错,有的电脑会报错,有的不会 报错内容为 ORA-01406:提取的列值被截断 查了网上提供的一些 ...

  6. python笔记——dict和set

    学习廖雪峰python3笔记_dict和set dict__介绍 dict --> dictionary(字典)--> python内置 --> 使用键-值(key-value)存储 ...

  7. CodeForces-431D Random Task

    题目描述 求一个\(n\),使得\(n+1\)到\(2n\)这些数的二进制中恰好有\(k\)个\(1\)的数有\(m\)个. Input 输入包含两个正整数\(m,k\).$(0<=m<= ...

  8. APT高持续渗透攻击-后门篇

    APT是指高级持续性威胁, 利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式,APT攻击的原理相对于其他攻击形式更为高级和先进,其高级性主要体现在APT在发动攻击之前需要对攻击对象的业务流 ...

  9. qt在tableview中绘制图片

    void ItemModelDeletage::paint(QPainter *painter, const QStyleOptionViewItem &option, const QMode ...

  10. 使用QtXlsx来读写excel文件

    概述:QtXlsx是功能非常强大和使用非常方便的操作excel类库.包括对excel数据读写.excel数据格式设置及在excel里面根据数据生成各种图表. 下面重点介绍如何安装和使用QtXlsx. ...