本蒟蒻又双叒叕被爆踩辣!

又是一道经典的贪心题

那么怎样切割该块巧克力,花费的代价最少呢?

Solution:

窝们考虑每个状态,有多少种选择方法?

是不是可以选择横着切或者竖着切,就这两种方法吧;

窝们再来考虑这两种方法的代价,

首先,如果窝们准备横着切,那么此次处理的代价就是当前这次的代价*(已经竖着切的数量 + 1),因为已经竖着切出了这么多次,所以代价就是这个(那个+1的原因是巧克力本来就有一块好不好,切一次不就有两块辣。。。)

ans += q.top() * s2;//那么当前的代价就是s2次乘单次代价

那么如果窝们现在准备竖着切,那么是不是同理就可以推出当前这次的代价*(已经横着切的数量 + 1),因为已经横着切出了这么多次,所以代价就是这个(那个+1的原因是巧克力本来就有一块好不好,切一次不就有两块辣。。。)

ans += qq.top() * s1;//那么当前的代价就是s1次乘单次代价

那么窝们已经知道了两种方案的代价辣,窝们接下来就是要找最优方案辣:

窝们每次都比较两种方案,看那种更优窝们就选哪种方案

因为窝们每次都选择当前最优,所以窝们也同时可以保证全局最优!

Code:

#include<bits/stdc++.h>

using namespace std;

#define Rep(x, a, b) for(int x = a; x <= b; ++ x)

priority_queue<int> q, qq;//优先队列可以维护序列单调性
//q表示横着切,qq表示竖着切 int n, m, x, s1 = 1, s2 = 1, ans;
//s1表示已经横着切了多少次辣
//s2表示已经竖着切了多少次辣
//ans就是答案辣 int main(){
scanf("%d%d", &n, &m);
Rep(i, 1, n - 1){//因为切成n*m块,所以横着切n - 1次
scanf("%d", &x);//读入每次代价
q.push(x);//压入优先队列,维护其单调性
}
Rep(i, 1, m - 1){//同理,竖着切m-1次
scanf("%d", &x);//读入每次代价
qq.push(x);//压入优先队列,维护其单调性
}
while(! q.empty() && ! qq.empty()){//只要一个优先队列空了就要退出,因为如果有一个空了,那么它的top就会返回空,然后就会死循环。。
//找当前是竖着切更优还是横着切更优
if(q.top() > qq.top()){//如果是横着切更优
ans += q.top() * s2;//那么当前的代价就是s2次乘单次代价
++ s1;//记得更新s1的值,多了一份
q.pop();//已经切完的就要弹出
}
else{
ans += qq.top() * s1;//那么当前的代价就是s1次乘单次代价
++ s2;//记得更新s2的值,多了一份
qq.pop();//已经切完的就要弹出
}
}
//因为弹出来后只要一个方向是空,那么就只能去另一个方向辣,下面就是找哪一个不是空的
while(! q.empty()){//如果可以横着切,(好像也只能横着切
ans += q.top() * s2;// 那么当前的代价就是s2次乘单次代价
q.pop();//已经切完的就要弹出
++ s1;//这里可加可不加辣,因为qq已经空了,s1就没用了
}
while(! qq.empty()){//如果可以竖着切,(好像也只能竖着切
ans += qq.top() * s1;//那么当前的代价就是s1次乘单次代价
qq.pop();//已经切完的就要弹出
++ s2;//同上辣
}
printf("%d", ans);//输出
return 0;
}

AC1

修改一下:下面放一个对新人友好一点代码,思路差不多,不过注释较少

#include<bits/stdc++.h>

using namespace std;

int n, m, ans, s1 = 1, s2 = 1;

#define maxn 20010
#define Rep(x, a, b) for(int x = a; x <= b; ++ x) struct node{
int v, c;
}e[maxn]; bool cmp(node a, node b){
return a.v > b.v;
} int main(){
scanf("%d%d", &n, &m);
Rep(i, 1, n - 1){//因为切成n*m块,所以横着切n - 1次
scanf("%d", &e[i].v);
e[i].c = 0;//把其标记为0
}
Rep(i, n, n + m - 2){//同理,竖着切m-1次
scanf("%d", &e[i].v);
e[i].c = 1;//把其标记为1
}
sort(e + 1, e + n + m - 1, cmp);
Rep(i, 1, n + m - 2){
if(e[i].c == 0){
ans += e[i].v * s2;
++ s1;
}
else{
ans += e[i].v * s1;
++ s2;
}
}
printf("%d", ans);
return 0;
}

AC2

Ps:请看懂再抄

洛谷 题解 P3173 【[HAOI2009]巧克力】的更多相关文章

  1. 洛谷——P3173 [HAOI2009]巧克力

    P3173 [HAOI2009]巧克力 题目描述 有一块n*m的矩形巧克力,准备将它切成n*m块.巧克力上共有n-1条横线和m-1条竖线,你每次可以沿着其中的一条横线或竖线将巧克力切开,无论切割的长短 ...

  2. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  3. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  4. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  5. 洛谷 P2983 [USACO10FEB]购买巧克力Chocolate Buying 题解

    P2983 [USACO10FEB]购买巧克力Chocolate Buying 题目描述 Bessie and the herd love chocolate so Farmer John is bu ...

  6. 洛谷P2983 [USACO10FEB]购买巧克力Chocolate Buying

    题目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Chocolate Sto ...

  7. 洛谷题解 CF777A 【Shell Game】

    同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...

  8. 洛谷题解 CF807A 【Is it rated?】

    同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...

  9. 洛谷题解 P1138 【第k小整数】

    蒟蒻发题解了 说明:此题我用的方法为桶排(我翻了翻有人用了桶排只不过很难看出来,可能有些重复的,这个题只是作为一个专门的桶排来讲解吧) (不会算抄袭吧 ‘QWaWQ’) 简单来说(会的人跳过就行): ...

随机推荐

  1. PHP更新用户微信信息的方法

    PHP更新用户微信信息的方法 大家都知道 授权登录一次 获取后 再登录就会提示已经授权登录 就没办法重新获得用户信息了 这个时候根据openid来获取了请求user/info这个获取ps:必须关注过公 ...

  2. pandas数据导出Execl

    脚本主要功能是将数据库查询到的结果,通过pandas写到到execl文件中. #!/usr/bin/env python #-*- coding: utf8 -*- from sqlalchemy i ...

  3. css的块级元素和行级元素

    块级元素 概念: 每个块级元素都是独自占一行.  元素的高度.宽度.行高和边距都是可以设置的.   元素的宽度如果不设置的话,默认为父元素的宽度(父元素宽度100%) <address>/ ...

  4. 在VMware环境下安装Windows2008

    1.软硬件安装 软件:推荐使用VMware,这里我使用的是VMware15 镜像:Windows 2008 如果没有镜像可以到这里 链接:https://pan.baidu.com/s/1r_7K-U ...

  5. SpringMVC错误:Failed to read candidate component class:file... ...

    Failed to read candidate component class:file错误分析和处理 org.springframework.beans.factory.BeanDefinitio ...

  6. T-SQL Part VIII: CROSS APPLY, OUTER APPLY

    除了CROSS JOIN, INNER JOIN, OUTER JOIN之外,T-SQL还提供了CROSS APPLY和OUTER APPLY这两个较为另类的Set操作符. 首先来看CROSS APP ...

  7. 如何基于 PHP-X 快速开发一个 PHP 扩展

    0x01 起步 PHP-X本身基于C++11开发,使用cmake进行编译配置.首先,你需要确定所有依赖项已安装好.包括: gcc-4.8 或更高版本 PHP7.0 或更高版本,需要php7-dev 开 ...

  8. Mysql主从同步的实现原理与配置实战

    1.什么是mysql主从同步? 当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库. 2.主从同步有什么好处? 水平扩展数据库的负载能力. 容错,高可用.Failover ...

  9. 领扣(LeetCode)转置矩阵 个人题解

    给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7] ...

  10. pwnable.kr 第一天

    1.FD 直接通过ssh连接上去,然后,看下源代码. #include <stdio.h> #include <stdlib.h> #include <string.h& ...