首页 > 代码库 > 数据备份
数据备份
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <cstdio> 7 #include <queue> 8 using namespace std ; 9 10 int n , k ;11 int sum[100006] , ans ;12 bool used[100006] ;13 struct node{14 int id , val;15 bool operator < ( const node & a ) const {16 return a.val < val ;17 }18 };19 priority_queue < node > Q ;20 int las[100006] ,nxt[100006] ;21 22 inline void Init ( ) {23 freopen( "10344.in" , "r" , stdin ) ;24 freopen( "10344.out" , "w" , stdout ) ;25 }26 27 void input ( ) {28 scanf( "%d%d" , &n , &k ) ;29 int a ; scanf( "%d" ,&a ) ;30 int b ;31 for ( int x = 2 ; x <= n ; x++ ) {32 scanf( "%d" , &b ) ;33 node tep ;34 sum[ x ] = b - a ;35 las[x] = x - 1 , nxt[x] = x + 1 ;36 // tep.val = sum[x] , tep.id = x ; 37 Q.push( node{ x , b - a } ) ;38 a = b ;39 } 40 }41 42 43 void sov( ) {44 int tot = 0 ;45 sum[1] = sum[n+1] = (1<<30)-1;46 while( tot < k ) {47 tot++ ;48 node tep ;49 while ( used[ Q.top( ).id ] ) Q.pop( ) ;50 tep = Q.top( ) ; Q.pop( ) ;51 ans += tep.val ;52 int l = las[ tep.id ] , r = nxt[ tep.id ] , v = sum[ l ] + sum[ r ] - sum[ tep.id ];53 sum[ tep.id ] = v ;54 Q.push( node { tep.id , v } ) ;55 if( l > 1 ) las[ tep.id ] = las[ l ] , nxt[ las[l] ] = tep.id , used[ l ] = true ;56 if( r <= n )nxt[ tep.id ] = nxt[ r ] , las[ nxt[r] ] = tep.id , used[ r ] = true ;57 }58 }59 60 61 void output( ) {62 printf( "%d\n" , ans ) ;63 }64 65 66 int main ( ) {67 // Init( ) ;68 input( ) ;69 sov( ) ;70 output( ) ;71 // fclose(stdin);72 // fclose(stdout);73 return 0 ;74 }
嗯 ,可以考虑贪心的思路 ,就是每次将最短的连起来 ,但是可能会出现选旁边的两段优于选中间的一段 ,所以将每段选出来后,就用旁边两段的大小减去这一段的大小来更新这一段 。
数据备份
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。