bzoj1150

haha,贪心,边界条件折腾了我一会儿 1 #include<cstdio>
 2 #include<cctype>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std ;
 6
 7 const int MAXN = 1000000 + 200 ;
 8 int N , K ;
 9 int dis [ MAXN ] ;
10 int l [ MAXN ] ;
11 int r [ MAXN ] ;
12 int v [ MAXN ] ;
13 int vis [ MAXN ] ;
14 int ans ;
15 struct cmp {
16     bool operator () ( const int a , const int b ) { return v [ a ] > v [ b ] ; } ;
17 } ;
18 priority_queue < int , vector < int > , cmp > q ;
19
20 int main () {
21     scanf ( "%d%d" , & N , & K ) ;
22     for ( int i = 1 ; i <= N ; ++ i ) scanf ( "%d" , dis + i ) ;
23     for ( int i = 1 ; i < N ; ++ i ) v [ i ] = dis [ i + 1 ] - dis [ i ] ;
24     for ( int i = 1 ; i < N - 1 ; ++ i ) r [ i ] = i + 1 ;
25     for ( int i = 2 ; i < N ; ++ i ) l [ i ] = i - 1 ;
26     for ( int i = 1 ; i < N ; ++ i ) q . push ( i ) ;
27     fill_n ( vis + 1 , N , 1 ) ;
28     v [ 0 ] = 1000000000 + 1 ;
29     v [ N ] = 1000000000 + 1;
30     while ( K -- ) {
31         while ( ! vis [ q . top () ] ) q . pop () ;
32         const int o = q . top () ; q . pop () ;
33         ans += v [ o ] ;
34         vis [ l [ o ] ] = 0 ;
35         vis [ r [ o ] ] = 0 ;
36         v [ o ] = v [ l [ o ] ] + v [ r [ o ] ] - v [ o ] ;
37         q . push ( o ) ;
38         l [ o ] = l [ l [ o ] ] ; r [ o ] = r [ r [ o ] ] ;
39         r [ l [ o ] ] = l [ r [ o ] ] = o ;
40     }
41     printf ( "%d\n" , ans ) ;
42 }
时间: 2024-08-08 21:56:49

bzoj1150的相关文章

bzoj1150 [CTSC2007]数据备份

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼

Bzoj1150 数据备份Backup

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一

bzoj1150: [CTSC2007]数据备份Backup--贪心+优先队列维护堆

题目大意:将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 之前向CZL大神学习了用堆来贪心的做法orz 大概思路就是将初始所有的线段放进堆里 每次取最短的线段进行连接,且ans+=a[i] 取完后删除当前线段,与相邻的两条线段,同时再插入新边,权值为a[pre]+a[next]-a[now] 其作用与最大流中的反向弧有点像,下一次若取到这条边,即ans+=a[pre]+a[next]-a[now] 很明显a[now

BZOJ1150 [CTSC2007]数据备份Backup

这是一道很好的题目,正常人都想不出做法. 我还记得题解是说: (1)想到动规,但是T到死... (2)转化成网络流,还是T的不行 (3)咦,好像是贪心欸,做出来了(你在卖萌!) 其实算法很简单,首先我们知道必须找相邻的两个进行配对,但是不是直接找最小,而是每次要找最短的一段(后面会解释什么叫"段"),于是可以用堆来维护. 具体做法是找出当前最短的段X,设左边那段叫L,右边那段叫R,那么: 只要(1)ans += dis[X]  (2)删除X.L.R三段,即堆中删除dis[X], dis

【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼都属于唯一的配

【bzoj1150】[CTSC2007]数据备份Backup

将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 将初始所有的线段放进堆里 每次取最短的线段进行连接,且ans+=a[i] 取完后删除当前线段,与相邻的两条线段,同时再插入新边,权值为a[pre]+a[next]-a[now] 其作用与最大流中的反向弧有点像,下一次若取到这条边,即ans+=a[pre]+a[next]-a[now] 很明显a[now]与之前抵消了,即不取now,反而取相邻的两条边去了 1 #incl

BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】

题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼都属于唯一

noip知识点总结之--贪心

一.什么是贪心 贪心算法嘛... 就是在对某个问题求解时,总是做出在当前看来是最好的选择 In other wors,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解 二.贪心算法的适用前提 局部的最优解能导致最后整体的最优解,即局部的最优解不受该部分以外的东西的影响 对于贪心算法,我们需要证明:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的 实际上,能用贪心算法的问题很少,大部分看上去能用贪心算法去做的题目,其实都得不到最优解T T(这时候就需要运用动态规划了) 而看

bzoj3502[PA2012]Tanie Linie(最大k区间和)

题意:给定一个长为n的数列,要求选出最多k个不相交的区间(可以不选),使得选中的数字之和最大.(1<=k<=n<=1000000)分析:首先我们通过预处理对问题做一些简化.原序列中的0对答案没有影响,可以直接删掉.连续的一段正数或一段负数一定是都选或者都不选,可以合并成一个数字.这样把序列转化成了正数和负数交替出现的形式.如果序列的最左端/最右端是负数,这个负数在最优解当中一定不会被选中,我们可以把它删掉.这样就把序列变成了正负交替,以正数开头和结尾的形式.这时若直接考虑选出k个不相交区