题目链接 2013 ACM/ICPC Asia Regional Online —— Warmup
hdu4706
Children's Day
就是循环使用a-z来输出一个反N
思路:直接模拟,采用一个数组来保存,数组中保存0-25的数字(字母出现的地方保存数字)(其他初始化为负数)
输出时,直接输出数组中的数字+‘a’ 负数输出空格
代码:
#include <stdio.h> #include <string.h> int a[12][12]; int main() { /*freopen("1.txt","w",stdout);*/ int t = 0; int n = 3,i,j,k; for(i = n; i <= 10; i++) { for(j = 0; j <=i; j++) for(k = 0; k <= i; k++) a[j][k] = -1; for(j = 1; j <= i; j++) { t %= 26; a[j][1] = t; ++t; } j = i-1,k = 2; while(1) { t %= 26; a[j][k] = t; j--;k++; ++t; if(j == 1) break; } for(j = 1; j <= i; j++) { t %= 26; a[j][i] = t; ++t; } for(j = 1; j <= i; j++) { for(k = 1; k <= i;k++) if(a[j][k] != -1) { printf("%c",'a'+a[j][k]); } else printf(" "); printf(" "); } } return 0; }
hdu 4707 Pet
使用并查集来做,以0为根节点,记录点到0的距离,大于d 则+1
代码:
#include <stdio.h> #include <string.h> #define N 100007 int f[N]; int time[N]; int t = 0; int find_f(int x) { if(f[x] == x) return x; else return find_f(f[x]); } void add(int x,int y,int d) { time[y] = time[x] + 1; if(time[y] > d) { t++; } int fx = find_f(x); int fy = find_f(y); f[fy] = fx; } int main() { int T,n,d,i,j,x,y; scanf("%d",&T); while(T--) { t = 0; memset(time,0,sizeof(time)); scanf("%d%d",&n,&d); for(i = 0; i <= n; i++) f[i] = i; for(i = 1; i< n; i++) { scanf("%d%d",&x,&y); add(x,y,d); } printf("%d ",t); } return 0; }
hdu 4708
Rotation Lock Puzzle
就是给你一个n*n的矩阵(n为奇数),通过旋转使得对角线的值最大,并输出旋转次数
简单模拟,对每一层进行枚举,得到这一层的最大值,计算这个最大值通过几次旋转得到,
使用 i 表示层数,j表示旋转次数
i <= n/2, j < (n- (i-1)*2)-1
然后枚举对角线得到这个值 ans = a[i+j][i] + a[n-(i-1)-j][n-(i-1)] + a[n-(i-1)][i+j] + a[i][n-(i-1)-j];
判断这个值是否是最大然后计算旋转次数 使用t来保存 t = j < (n-(i-1)*2 )-j -1? j : (n-(i-1)*2 )-j-1;
当最值相同的时候 保留旋转次数最少的那个
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int a[20][20]; int main() { int n,i,j; while(scanf("%d",&n) && n) { int ans = 0; int max = 0x80000000; int max_x = 0; int sum_x = 0,t,sum = 0; memset(a,0,sizeof(a)); for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) scanf("%d",&a[i][j]); for(i = 1; i <= n/2; i++) { max = 0x80000000; max_x = 0; for(j = 0; j < n-(i-1)*2-1; j++) { ans = a[i+j][i] + a[n-(i-1)-j][n-(i-1)] + a[n-(i-1)][i+j] + a[i][n-(i-1)-j]; if(ans > max) { max = ans; t = j < (n-(i-1)*2 )-j -1? j : (n-(i-1)*2 )-j-1; max_x = t; } if(ans == max) { t = j < (n-(i-1)*2 )-j -1? j : (n-(i-1)*2 )-j-1; if(max_x > t) { max = ans; max_x = t; } } } sum += max; sum_x += max_x; } sum += a[n/2+1][n/2+1]; printf("%d %d ",sum,sum_x); } return 0; }
hdu 4715
Difference Between Primes
这题是求一个数使用两个素数之差来表示 a - b = x ,输出这两个最小素数,这里的x是整数
思路: 首先进行素数打表,然后枚举a 判断b是否的素数,当x为负数的时候,将x当正数处理 相反输出即可
#include <stdio.h> #include <string.h> #include <math.h> #define N 1000007 int prime[N]; void init_prime() { int i,j; memset(prime,0,sizeof(prime)); prime[0]=1; prime[1]=1; for(i=2;i<N;i++) { if(prime[i]==0) { for(j=i*2;j<N;j+=i) prime[j]=1; } } } int main() { init_prime(); int T,x1,x,i,y,z,t; scanf("%d",&T); while(T--) { scanf("%d",&x1); int flag = 1; int T_T = 0; y = 0,z = 0; x = (fabs)(x1); for(i = x; i < N; i++) if(prime[i] == 0) { if(T_T > 1 && (fabs)(y-z) > x ) { break; } T_T++; if(T_T & 1) y = i; else z = i; t = i - x; if(prime[t] == 0 && t > 0) { if(x1 >= 0) printf("%d %d ",i,t); else printf("%d %d ",t,i); flag = 0; break; } } if(flag) printf("FAIL "); } return 0; }
后续更新。。。。