【优先级队列】Southwestern Europe Regional Contest Canvas Painting
https://vjudge.net/contest/174235#problem/D
【题意】
- 给定n个已知size的帆布,要给这n块帆布涂上不同的颜色,规则是这样的:
- 每次选择一种颜色C
- 对于颜色为C的所有帆布都要涂上颜色,其中前F个涂为颜色X,剩下的涂为颜色Y,X和Y都是不同于任何已知颜色的颜色
- 每次涂颜色用掉的墨水用量都是帆布的size
- 重复步骤2和3直到所有的帆布都是不同的颜色
- 求最少要多少墨水
【思路】
- 第一次涂把帆布变成两种颜色,剩下每次涂色都是增加一种颜色,所以n块帆布一定是涂n-1次色
- 观察涂色的过程像是一棵树不断分枝
- 可以考虑涂色的逆过程,最初是n种不同的颜色,每次选择两种颜色合并成一种颜色
- 一定是选择size最小的两种颜色合并成一种颜色
- 类似于哈夫曼树,用优先级队列做
【Accepted】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<set>
#include<functional>
#include<queue>
using namespace std;
typedef long long ll;
int n; const int maxn=1e5+; struct node
{
ll val;
friend bool operator<(node n1,node n2)
{
return n2.val<n1.val;
}
}a[maxn];
priority_queue<node> q;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
while(!q.empty()) q.pop();
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%lld",&a[i].val);
q.push(a[i]);
}
ll ans=0ll;
for(int i=;i<n-;i++)
{
ll x=q.top().val;
q.pop();
ll y=q.top().val;
q.pop();
ans+=x+y;
node nd;
nd.val=x+y;
q.push(nd);
}
cout<<ans<<endl;
}
return ;
}
【优先级队列的用法】
优先级队列的默认排序是从大到小,而且不能重载>,有一下两种方式实现从小到大排序:
struct node
{
ll val;
friend bool operator<(node n1,node n2)
{
return n2.val<n1.val;
}
}a[maxn];
结构体
priority_queue<ll,vector<ll>,greater<ll> > q;
greater
【教训】
一开始WA了一发是因为多组数据,没有在每组数据前清空队列,以后对于vector,set,q,pq之类的一定要记得清空
【优先级队列】Southwestern Europe Regional Contest Canvas Painting的更多相关文章
- 2015-2016 ACM-ICPC Southwestern Europe Regional Contest (SWERC 15)
C. Canvas Painting 合并果子. E. Wooden Signs \(dp(i,l,r)\)表示第\(i\)块木板的长度区间为\([l,r]\)的方案数,根据题意,\(l\)或\(r\ ...
- Southwestern Europe Regional Contest 2014 题解
时间:2017/9/8 题目8/10 Rank 5/150 体会:三星的题目和国内区域赛差距大,大多数题读懂题意就能做,所以静心读题是关键,套路性太深. A: 题意:给出一个算式,算式中的数字用大写字 ...
- Southwestern Europe Regional Contest 2015 题解
题目链接:http://codeforces.com/gym/101128 题目数7/10 Rank 34/209 A: 题意:给出一张n个点的有向图表示一家有n个员工的公司的隶属图,u->v表 ...
- 【枚举】Southwestern Europe Regional Contest H - Sheldon Numbers
https://vjudge.net/contest/174235#problem/H [题意] 求[x,y]之间有多少个Sheldon Number Sheldon Number是二进制满足以下条件 ...
- Gym 101128A :Promotions (Southwestern Europe Regional Contest )
题意 一个公司里有E个员工P个上下级关系.这个公司有一种晋升制度.如果要晋升员工a,那么必须要先晋升a的所有领导.给出一个区间[A,B],如果要晋升A个员工,有哪些员工是一定会被晋升的?如果要晋升B个 ...
- ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków
ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...
- Central Europe Regional Contest 2012 Problem J: Conservation
题目不难,感觉像是一个拓扑排序,要用双端队列来维护: 要注意细节,不然WA到死 = =! #include<cstdio> #include<cstring> #includ ...
- Central Europe Regional Contest 2012 Problem I: The Dragon and the Knights
一个简单的题: 感觉像计算几何,其实并用不到什么计算几何的知识: 方法: 首先对每条边判断一下,看他们能够把平面分成多少份: 然后用边来对点划分集合,首先初始化为一个集合: 最后如果点的集合等于平面的 ...
- Central Europe Regional Contest 2012 Problem c: Chemist’s vows
字符串处理的题目: 学习了一下string类的一些用法: 这个代码花的时间很长,其实可以更加优化: 代码: #include<iostream> #include<string> ...
随机推荐
- Java 关键字volatile的解释
volatile 关键字特征: 1.可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.可以禁止线程的工作内存对volatile修饰的变量进行缓存,并将修改的变量立即写入主存. 2. ...
- ios 微信环境 axios请求 status 0
做了一个支付页面,调用post请求但是请求status 0,出现这个的原因居然是https的网页请求http的数据. 但是这个再ios里面不会报错,安卓正常. 记录一下客户端的这个特征!
- cordova应用使用手机调试
对于cordova应用的调试,最方便调试方式还是作为h5应用在浏览器来调试,调试好了再打包cordova应用和打包apk.然而h5应用时的效果跟最终在安卓手机运行还有少数情况会不一样,因此,也需要有能 ...
- JSP自定义标签开发步骤
自定义的标签库一.基本概念: 1.标签(Tag): 标签,通常也成为动作,是一组按照XML语法格式编写的代码片段,在JSP中,用来封装在页面中可重复利用的逻辑,通过标签可以使JSP网页变得简洁并且易于 ...
- iOS 应用程序内部国际化,不跟随系统语言
前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...
- iOS html格式解析
使用TFHpple解析html https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 ...
- Scala基础篇-05求值策略
Scala的求值策略有2种: call by value call by name 如何区分? 例子: def bar(x:Int,y: => Int) = def loop(): Int=lo ...
- ubuntu4.04服务器添加虚拟主机
buntu 14.04配置虚拟主机 虚拟主机常用于在一个单独的IP地址上提供多个域名的网站服务.如果有人想在单个VPS的单个IP地址运行多个网站,这是非常有用的.在这个教程中,让我告诉你如何设置在 ...
- Big Data Mindmap
- SQLite -插入查询
SQLite -插入查询 SQLite插入语句是用来添加新行数据到数据库中的一个表. 语法: 有两种基本的插入语句的语法如下: INSERT INTO TABLE_NAME (column1, co ...