ZOJ Monthly, August 2014小记

2024-09-09 08:08
文章标签 zoj monthly 2014 小记 august

本文主要是介绍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小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150618

相关文章

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

ZOJ 3324 Machine(线段树区间合并)

这道题网上很多代码是错误的,由于后台数据水,他们可以AC。 比如这组数据 10 3 p 0 9 r 0 5 r 6 9 输出应该是 0 1 1 所以有的人直接记录该区间是否被覆盖过的方法是错误的 正确方法应该是记录这段区间的最小高度(就是最接近初始位置的高度),和最小高度对应的最长左区间和右区间 开一个sum记录这段区间最小高度的块数,min_v 记录该区间最小高度 cover

2014年暑假培训 - 数论

A银河上的星星 /**************************************************************     Problem: 1014     User: DoubleQ     Language: C++     Result: Accepted     Time:190 ms     Memor