2013 ACM/ICPC Asia Regional Online —— Warmup

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

 后续更新。。。。

posted @ 2013-09-10 16:00  heity  阅读(387)  评论(0编辑  收藏  举报