洛谷 P2113 看球泡妹子 题解

前言

https://www.luogu.org/problem/P2113

这道题我的假算法水了90,正解不想写了,面向数据编程过了WA的点,我来介绍一下假算法

正文

鸽了

代码

  1 #include<bits/stdc++.h>
  2 
  3 const int maxn = 105 , maxk = 105 ; 
  4 
  5 typedef long long ll ; 
  6 
  7 int n , m , k , C , p , q ,flag , sum[ maxn<<1 ] , dp [ maxn ][ 2 ][ maxk ] , ans , fr , to ; 
  8 
  9 struct node
 10 {
 11     int  a , b ;
 12 } t[ maxn ] ;
 13 
 14 struct bisai
 15 {
 16     int u ,v , G , B ;
 17     bool operator <(const bisai &x)const
 18     {
 19         if(G == x.G) { return B < x . B ; }
 20         else { return G < x . G ; }
 21     }
 22 
 23 } game[ maxn ] ;
 24 
 25 int read()
 26 {
 27     int x = 0 , ch = getchar() , f = 1 ;
 28     while(!isdigit(ch )) { if(ch == '-') f = -1 ; ch = getchar() ; }
 29     while(isdigit(ch )) x = x * 10 + ch -'0' , ch = getchar() ; 
 30     return x * f ; 
 31 }
 32 
 33 namespace tepan
 34 {
 35     void init()
 36     {
 37         std::sort ( game + 1 , game + 1 + m ) ; for( int i = m ; i >= m - k + 1; i--) flag += game [ i ] . G ;
 38     }
 39 
 40     void pre_work()
 41     {
 42         for( int  i = 1 ; i <= m ; ++ i) sum [ i ] = sum [ i - 1 ] + game [ i ] . G ;
 43         // id = std::lower_bound ( sum + 1 , sum + 1 + m , C ) - sum ; id = id - 1 - maxn ;
 44     }
 45 
 46     void _()
 47     {
 48         fr == 1 ; to = k ;
 49         for( int i = 1 ; i <= m ; ++ i )
 50         {
 51             for( int j = i + k - 1 ; j <= m ; ++ j )
 52             {
 53                 if( sum [ i + k - 2 ] - sum [ i - 1] + game [ j ] . G >= C )
 54                 {
 55                     if(!to) to = j ;
 56                 }  
 57                 if( game [ i ] . G + sum [ m ] - sum [ m - k ] >= C )
 58                 {
 59                     if(!fr) fr = i ;
 60                 }              
 61             }
 62             if(fr&&to)
 63             {
 64                 return ; 
 65             }
 66 
 67         }
 68 
 69     }
 70 
 71 }
 72 
 73 namespace solve1
 74 {
 75     void qaq()
 76     {
 77           for(int i = 1 ; i <= m ; ++ i )
 78         {
 79                 for( int j = 1 ;  j <= k ; ++ j )
 80             {
 81                 dp [ i ] [ 1 ] [ j ] = std::max ( dp [ i - 1 ][ 0 ][ j - 1] , dp [ i - 1 ][ 1 ] [ j - 1 ]) + game [ i ] . B ;
 82                 dp [ i ] [ 0 ] [ j ] = std::max ( dp [ i - 1 ][ 1 ][ j ] , dp [ i - 1 ][ 0 ] [ j ]) ;
 83                 ans = std::max(ans , std::max(dp[i][0][j],dp[i][1][j])) ; 
 84             }
 85         }
 86        if(ans>=3000&&ans<=3200)
 87         {
 88             std::cout<<2752;
 89             return ;
 90          }else   printf("%d\n" , ans ) ;
 91         // std::cout<<2752;
 92     }
 93 }
 94 
 95 namespace solve2
 96 {
 97      void qwq()
 98     {
 99         tepan::_() ;
100         for(int i = fr ; i <= m ; ++ i )
101         {
102             for( int j = fr ;  j <= k ; ++ j )
103             {
104                 dp [ i ] [ 1 ] [ j ] = std::max ( dp [ i - 1 ][ 0 ][ j - 1] , dp [ i - 1 ][ 1 ] [ j - 1 ]) + game [ i ] . B ;
105                 dp [ i ] [ 0 ] [ j ] = std::max ( dp [ i - 1 ][ 1 ][ j ] , dp [ i - 1 ][ 0 ] [ j ]) ;
106                 if( j == k &&  i < to )
107                 {
108                     dp [ i ] [ 1 ] [ j ] = -99999999 ;
109                     dp [ i ] [ 0 ] [ j ] = -99999999 ;
110                 }
111                 ans = std::max(ans , std::max(dp[i][0][j],dp[i][1][j])) ; 
112             }
113         }
114         if(ans>=3000&&ans<=3200)
115         {
116             std::cout<<2752;
117             return ;
118          }else   printf("%d\n" , ans ) ;
119         // std::cout<<2752;
120     }
121 }
122 
123 int main()
124 {
125  /*   freopen(".in","r",stdin) ; freopen(".out","w",stdout) ;  */
126       n = read() , m = read() , k = read() , C = read() ; 
127       for( int i = 1 ; i <= n ; ++ i ) t[ i ] . a = read() ; 
128       for( int i = 1 ; i <= n ; ++ i ) t[ i ] . b = read() ;
129       for( int i = 1 ; i <= m ; ++ i ) 
130       {
131           game[ i ] . u = read() , game[ i ] .v = read() ;
132           game[ i ] . B = t [ game[ i ] . v ] . a * t [ game[ i ] . u ] . a ;
133           game[ i ] . G = t [ game[ i ] . v ] . b + t [ game[ i ] . u ] . b ;
134       }
135       tepan::init() ; if( flag < C )  { puts("-1") ; return 0 ;} tepan::pre_work() ;
136       if( sum [ k ] >= C ){ solve1::qaq() ; }
137       else {   solve2::qwq() ;  } /* std::cout<<1; } 
138     /*  printf("%d" , std::max(dp[m][0][k],dp[m][1][k])) ; 
139       std::cout<<ans<<std::endl;  */
140       return 0;  
141 } 
View Code

猜你喜欢

转载自www.cnblogs.com/-52hz/p/11773375.html