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 ; }
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 ; }
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 ; }