2014年百度之星程序设计大赛 - 资格赛题解


1001  暴力

typedef  long long LL ;

int  main(){
     LL n , m , v , k , x ;
     int t , s ;
     cin>>t ;
     while(t--){
          scanf("%I64d%I64d%I64d%I64d" ,&n,&m,&v,&k) ;
          if(m >= n){
               puts("0")  ; continue ;
          }
          if(k < 0){
                puts("-1") ; continue ;
          }
          if(k == 1){
                puts("-1") ;
                continue ;
          }
          if(m < v){
               puts("-1") ;
               continue ;
          }
          s = 0 ;
          x = m ;
          while(x < n){
               x = (x-v)*k ;
               s++ ;
               if(x < v || x == m)  break ;
          }
          if(x >= n) printf("%d\n" , s) ;
          else       puts("-1") ;
     }
     return 0 ;
}


1002  双调TSP

const  int maxn = 1008 ;

int  x[maxn] , y[maxn]  ;
int  dp[maxn][maxn] ;
int  N ;
int  dist[maxn][maxn] ;

int  getdist(int a  , int b){
     int t = (y[a] >= y[b])? (y[a] - y[b]) : (y[b] - y[a]) ;
     return min(t , 360-t) ;
}

int  DP(){
        int i , j , ans = 100000000 ;
        for(i = 1 ; i <= N ; i++){
            for(j = i ; j <= N ; j++){
                dist[i][j] = dist[j][i] = getdist(i , j) ;
                dp[i][j] = dp[j][i] = 100000000 ;
            }
        }
        dp[2][1] = dist[2][1] ;
        for(i = 2 ; i < N ; i++){
            for(j = 1 ; j < i ; j++){
                 dp[i+1][i] = min(dp[i+1][i] , dp[i][j] + dist[j][i+1]) ;
                 dp[i+1][j] = min(dp[i+1][j] , dp[i][j] + dist[i][i+1]) ;
            }
        }
        for(i = 1 ; i < N ; i++)
              ans = min(ans , dp[N][i] + dist[i][N]) ;
        return ans ;
}

int  main(){

     int t , i , row , col  , n , s ;
     cin>>t ;
     while(t--){
          scanf("%d" ,&n) ;
          N = n+1 ;
          x[1] = y[1] = 0 ;
          for(i = 2 ; i <= N ; i++){
                scanf("%d%d" ,&x[i] , &y[i]) ;
          }
          s = x[N]*2*400 + 10*n ;
          s += DP() ;
          cout<< s << endl ;
     }
     return 0 ;
}


1003 字典树,贪心。

typedef  long long LL ;

struct  TrieNode{
        int  val ;
        TrieNode *next[2] ;
};

void   Insert(TrieNode * root , int  x){
       int t ;
       TrieNode *now = root ;
       for(int i = 31 ; i >= 0 ; i--){
            if(x & (1<<i)) t = 1 ;
            else           t = 0 ;
            if(now->next[t] == NULL){
                  TrieNode *node = (TrieNode *)malloc(sizeof(TrieNode)) ;
                  node->next[0] = node->next[1] = NULL ;
                  now->next[t] = node ;
                  now = node ;
            }
            else now = now->next[t] ;
       }
       now->val = x ;
}

int   Get(TrieNode *root , int x){
     int t  ;
     TrieNode *now = root ;
     for(int i = 31 ; i >= 0 ; i--){
            if(x & (1<<i)) t = 1 ;
            else           t = 0 ;
            if(now->next[t^1] != NULL)
                now = now->next[t^1] ;
            else now = now->next[t] ;
     }
     return now->val ;
}

void  Clear(TrieNode *root){
      for(int i = 0 ; i <= 1 ; i++){
           if(root->next[i] != NULL)
              Clear(root->next[i]) ;
      }
      free(root) ;
}

int  main(){
     int t , n ,  m  , T = 1  , x ;
     cin>>t  ;
     while(t--){
          TrieNode *root = (TrieNode *)malloc(sizeof(TrieNode)) ;
          root->next[0] = root->next[1] = NULL ;
          scanf("%d%d" ,&n,&m) ;
          while(n--){
               scanf("%d" ,&x) ;
               Insert(root , x) ;
          }
          printf("Case #%d:\n" , T++) ;
          while(m--){
               scanf("%d" ,&x) ;
               printf("%d\n" ,Get(root , x)) ;
          }
     }
     return 0 ;
}


1004 线性dp

const  int  maxn = 108  ;
int    c[maxn][maxn]  ;
int    dp[maxn][maxn] ;

int    checkmax(int &a , int b){
       if(a < b) a = b ;
}

int  main(){
     int t , n ,  m  , T = 1  , x  , i , j , k , y ;
     cin>>t  ;
     while(t--){
          memset(dp , -63 , sizeof(dp)) ;
          cin>>n>>m  ;
          for(i = 1 ; i <= n ; i++)
             for(j = 1 ; j <= m ; j++) scanf("%d" ,&c[i][j]) ;
          dp[0][1] = 0 ;
          for(i = 1 ; i <= n ; i++)  dp[i][1] = dp[i-1][1] + c[i][1] ;
          for(j = 2 ; j <= m ; j++){
              for(i = 1 ; i <= n ; i++){
                 x = y = dp[i][j-1] + c[i][j] ;
                 checkmax(dp[i][j] , x)  ;
                 for(k = i-1 ; k >= 1 ; k--){
                       x += c[k][j] ;
                       checkmax(dp[k][j] , x) ;
                 }
                 for(k = i+1 ; k <= n ; k++){
                       y += c[k][j] ;
                       checkmax(dp[k][j] , y) ;
                 }
              }
          }
          printf("Case #%d:\n%d\n" , T++ , dp[1][m]) ;
     }
     return 0 ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值