您的位置:首页 > 其它

2013 ACM/ICPC Asia Regional Online —— Warmup

2013-09-10 16:00 561 查看
题目链接 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("\n");
}
}
return 0;
}


hdu 4707 Pet

使用并查集来做,以0为根节点,记录点到0的距离,大于d 则+1

代码:

#include <stdio.h>
#include <string.h>

#define N 100007

int f
;
int time
;
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\n",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\n",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
;

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\n",i,t);
else
printf("%d %d\n",t,i);
flag = 0;
break;
}
}
if(flag)
printf("FAIL\n");
}
return 0;
}


后续更新。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐