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