CH Round #53-数据备份
描述
已知有N座办公楼位于同一条街上。你决定给这些办公楼配对(两个一组)。每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备 份。然而,网络电缆的费用很高。当地电信公司仅能为你提供K条网络电缆,这意味着你仅能为K对办公楼(或总计2K个办公楼)安排备份。任一个办公楼都属于 唯一的配对组(换句话说,这2K个办公楼一定是相异的)。 此外,电信公司需按网络电缆的长度(公里数)收费。因而,你需要选择这K对办公楼使得电缆的总长度尽可能短。换句话说,你需要选择这K对办公楼,使得每一 对办公楼之间的距离之和(总距离)尽可能小。
输入格式
输入的第一行包含整数n和k,n表示办公楼的数目,k表示可利用的网络电缆的数目。
接下来的n行每行包含一个整数s, 表示每个办公楼到大街起点处的距离。这些整数将按照从小到大的顺序依次出现。
输出格式
一个正整数,表示将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
样例输入
5 2
1
3
4
6
12
样例输出
4
数据范围与约定
- 对于30%的数据,N<=20。
- 对于60%的数据,N<=10000。
- 对于100%的数据,N<=100000,1<=k<=n/2,0<=s<=10^9。
题解:
了解此题的贪心做法后简直惊呆了。。。orz。。。
while(q.top().first!=len[q.top().second])q.pop();
int c=q.top().second,l=pre[c],r=nxt[c];
ans+=len[c];q.pop();
pre[nxt[c]=nxt[r]]=c;nxt[pre[c]=pre[l]]=c;
len[c]= l&&r?min(inf,len[l]+len[r]-len[c]):inf;
len[l]=len[r]=inf;
q.push(make_pair(len[c],c));
关键语句在这里。
每次贪心选取距离最小的点,可能会影响到上下的点,那我就加入一个新节点 len[l]+len[r]-len[c],以防以后后悔
什么意思呢,就是发现取了c点,再取一个另外的点不如取 l和r优,这时候就反悔,选上 后来加入的c点,距离刚好是len[l]+len[r]
以后发现再不对了,就再修改,正确性是显然的。
orzzzzzzzzzzzzzzzzzzzzzz
代码:
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define inf 1000000000 #define maxn 100000+1000 #define maxm 500+100 #define eps 1e-10 #define ll long long #define pa pair<int,int> #define for0(i,n) for(int i=0;i<=(n);i++) #define for1(i,n) for(int i=1;i<=(n);i++) #define for2(i,x,y) for(int i=(x);i<=(y);i++) #define for3(i,x,y) for(int i=(x);i>=(y);i--) #define mod 1000000007 using namespace std; inline int read() { int x=,f=;char ch=getchar(); while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();} while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();} return x*f; }
priority_queue<pa,vector<pa>,greater<pa> > q;
int n,m,len[maxn],pre[maxn],nxt[maxn]; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();int x=,y;
for1(i,n)
{
y=read();
len[i]=y-x;pre[i]=i-;nxt[i]=i+;
x=y;
}
pre[]=;
nxt[n]=;
int ans=;
for2(i,,n)q.push(make_pair(len[i],i));
for1(i,m)
{
while(q.top().first!=len[q.top().second])q.pop();
int c=q.top().second,l=pre[c],r=nxt[c];
ans+=len[c];q.pop();
pre[nxt[c]=nxt[r]]=c;nxt[pre[c]=pre[l]]=c;
len[c]= l&&r?min(inf,len[l]+len[r]-len[c]):inf;
len[l]=len[r]=inf;
q.push(make_pair(len[c],c));
}
printf("%d\n",ans); return ; }
CH Round #53-数据备份的更多相关文章
- CH Round #53 -【Nescafé 32】杯NOIP模拟赛
A.GCD Path http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D ...
- CH Round #53 -GCD Path
描述 给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边.有Q个询问,每个询问包含两个数x和y,求x到y的最短距离. 输入格式 第一行包含两个用空格隔开的整数,N和Q. 接下 ...
- CH Round #53 -密室
描述 有N个密室,3种钥匙(红色,绿色,白色)和2种锁(红色,绿色),红色钥匙只能开红色的锁,绿色钥匙只能开绿色的锁,白色钥匙可以开红色的锁和绿 色的锁,一把钥匙使用一次之后会被扔掉.每个密室由一扇门 ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- CH Round #30 摆花[矩阵乘法]
摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...
- contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve
http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- CH Round #17 舞动的夜晚
舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...
- CH Round #45 能量释放
能量释放 CH Round #45 - alan有一些陷阱 III 题目描述 alan得到一块由个能量晶体构成的矿石,对于矿石中的每一个能量晶体,如果用化学物质刺激某一个能量晶体,就能使它释放能量. ...
随机推荐
- HDU_2024——判断字符串是否是c语言合法标识符
Problem Description 输入一个字符串,判断其是否是C的合法标识符. Input 输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是 ...
- BIND9的架构与机制笔记1
BIND9采用的是事件驱动的机制来工作,而事件的源头则是IO,IO在linux使用的EPOLL的边缘触发模式. 本篇说的是epoll,BIND9如果创建了watcher线程(宏USE_WATCHER_ ...
- HDFS文件系统的操作
package com.bank.utils; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;impor ...
- 简单的新闻客户端APP开发(DCloud+thinkphp+scrapy)
前端时间花了1个月左右,搞了个新闻APP,功能很简单,就是把页面版的新闻条目定时爬到后台数据库,然后用app显示出来. 1.客户端 使用了DCloud框架,js基本是个新手,从没写过像样的代码,htm ...
- PHP的输出缓冲区
什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调 ...
- 关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
此文章转载自:http://www.myexception.cn/mobile/1259076.html 关于javax.crypto.BadPaddingException: Blocktype异常 ...
- Could not Build module ImageIO
错误提示:Could not Build module ImageIO: 原因:修改了XCode API 源文件 措施:从一个干净的未曾修改过的XCode中拷贝一份相应的文件添加到发生错误的XCode ...
- PHP magic_quotes_gpc
大多的PHP程序,都有这样的逻辑: 如果发现php.ini配置为不给GPC变量自动添加转义斜线,则PHP自动为GPC添加转义斜线 但是事实上,这是错误的,因为它改变了GPC变量原来的值. 有这个遗留习 ...
- eclipse format的时候如何让@param后不换行
- linux diff具体解释
diff是Unix系统的一个非常重要的工具程序. 它用来比較两个文本文件的差异,是代码版本号管理的基石之中的一个.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件 ...