本文主要是介绍ZOJ Monthly, August 2014小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。
A 我只能死找规律了,无法证明
int a[50002][2] ;
vector< vector<int> > gmax , gmin ;
int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){
/* gmax.clear() ;gmin.clear() ;cmax = -1 ;cmin = n*2 ;for(i = 1 ; i <= n ; i++) a[i] = i ;do{k = a[1] ;for(i = 2 ; i <= n ; i++) k = abs(a[i] - k) ;cmax = max(cmax , k) ;cmin = min(cmin , k) ;}while(next_permutation(a+1 , a+n+1)) ;for(i = 1 ; i <= n ; i++) a[i] = i ;do{vector<int> c ;for(i = 1 ; i <= n ; i++) c.push_back(a[i]) ;k = a[1] ;for(i = 2 ; i <= n ; i++) k = abs(a[i] - k) ;if(k == cmax)gmax.push_back(c) ;if(k == cmin)gmin.push_back(c) ;}while(next_permutation(a+1 , a+n+1)) ;vector<int> c ;cout<<cmin<<endl ;for(int i = 0 ; i < gmin.size() ; i++){c = gmin[i] ;for(j = 0 ; j < c.size() ; j++) printf("%d " , c[j]) ;puts("") ;}cout<<cmax<<endl ;for(int i = 0 ; i < gmax.size() ; i++){c = gmax[i] ;for(j = 0 ; j < c.size() ; j++) printf("%d " , c[j]) ;puts("") ;}
*/k = 0 ;for(i = n ; i >= 1 ; i--) a[++k][0] = i ;k = 0 ;for(i = n-1 ; i >= 1 ; i--) a[++k][1] = i ;a[++k][1] = n ;cmin = a[1][0] ;for(i = 2 ; i <= n ; i++) cmin = abs(a[i][0] - cmin) ;cmax = a[1][1] ;for(i = 2 ; i <= n ; i++) cmax = abs(a[i][1] - cmax) ;printf("%d %d\n" , cmin , cmax) ;for(k = 0 ; k <= 1 ; k++){printf("%d" , a[1][k]) ;for(i = 2 ; i <= n ; i++) printf(" %d" , a[i][k]) ;puts("") ;}}return 0 ;
}
H 题目描述很有意思,看了很久,其实就是按要求去构造一颗二叉树。这个题比A题简单,就是要看懂题意。
const int maxn = 10008 ;
int son[maxn][2] ;
int n ;int ans(int u){int l = son[u][0] , r = son[u][1] ;if(l == -1 && r == -1) return 1 ;int cl = 0 , cr = 0 ;if(l != -1) cl = ans(l) ;if(r != -1) cr = ans(r) ;return min( max(cl+1 , cr) , max(cr+1 , cl)) ;
}int main(){int i , j ;while(scanf("%d" , &n) != EOF){for(i = 1 ; i <= n ; i++) son[i][0] = son[i][1] = -1 ;for(i = 2 ; i <= n ; i++){scanf("%d" , &j) ;if(son[j][0] == -1) son[j][0] = i ;else son[j][1] = i ;}printf("%d\n" , ans(1)) ;}return 0 ;
}
G 模拟,按照要求往下写,设计合理就好写了,这种题我最近基本1A。感觉这类题只是code题,或许我只会渣渣的code吧。
const int maxn = 58 ;
int n , m ;
char c[maxn][maxn] ;
int g[maxn][maxn][2] ;
vector< pair<int , int> > lis[1008] ;int d[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}} ;int can(int x , int y){return 1 <= x && x <= n && 1 <= y && y <= m ;
}int sum(int x , int y , int k){int t = 0 ;for(int i = 0 ; i < 8 ; i++){int xx = x + d[i][0] ;int yy = y + d[i][1] ;if(can(xx , yy) && g[xx][yy][k] == 1) t++ ;}return t ;
}char to(int i){if(i == 3) return 'X' ;if(i == 1) return '1' ;return '0' ;
}int main(){int t , f , k , i , j , a , s ;pair<int , int> p ;cin>>t ;while(t--){scanf("%d%d%d%d" , &n , &m ,&f ,&k) ;for(i = 1 ; i <= n ; i++) scanf("%s" , c[i]+1) ;for(i = 1 ; i <= n ; i++)for(j = 1 ; j <= m ; j++) g[i][j][0] = c[i][j] - '0' ;for(i = 0 ; i <= f ; i++) lis[i].clear() ;while(k--){scanf("%d%d%d" , &i , &p.first , &p.second) ;lis[i].push_back(p) ;}k = 0 ;for(a = 1 ; a <= f ; a++){for(i = 1 ; i <= n ; i++){for(j = 1 ; j <= m ; j++){g[i][j][k^1] = g[i][j][k] ;if(g[i][j][k] == 1){s = sum(i , j , k) ;if(s < 2 || s > 3) g[i][j][k^1] = 0 ;}else if(g[i][j][k] == 0){s = sum(i , j , k) ;if(s == 3) g[i][j][k^1] = 1 ;}}}for(i = 0 ; i < lis[a].size() ; i++){p = lis[a][i] ;g[p.first][p.second][k^1] = 3 ;}k ^= 1 ;}for(i = 1 ; i <= n ; i++){for(j = 1 ; j <= m ; j++)printf("%c" , to(g[i][j][k])) ;puts("") ;}}return 0 ;
}
I 几何, 二分,
构造等腰三角形,二分底边。利用外接圆半径求出内内接圆半径,与r比较。
底边越小内接圆半径越小,这是二分的性质
const double eps = 1e-9 ;double r , R ;void ans(){double cl = 0 , cr = sqrt(3.0) * R * 0.5 , m , h , len , inr ;while(cl + eps < cr){m = 0.5 * (cl + cr) ;h = sqrt( R*R - m*m) + R ;len = sqrt( h*h + m*m ) ;inr = (h * 2.0 *m ) / (len + len + m + m) ;if(inr < r) cl = m ;else cr = m ;}m = 0.5 * (cl + cr) ;h = sqrt( R*R - m*m) + R ;len = sqrt( h*h + m*m ) ;printf("%.18lf %.18lf %.18lf\n" , len , len , m+m) ;
}int main(){while(cin>>r>>R){if(r*2.0 > R){puts("NO Solution!") ;continue ;}ans() ;}return 0 ;
}
这篇关于ZOJ Monthly, August 2014小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!