九度OJ 1451-1460(10/10)

1451

#include <stdio.h>

int main()
{
 int i, j, n;
 long long f[21];
 while(scanf("%d", &n) != EOF)
 {
 f[0] = 1;
 f[1] = 0;
 for (i=2; i<=n; i++)
 {
 f[i] = (i-1)*(f[i-1]+f[i-2]);
 //f[i] = 0;
 //for (j=0; j<=i-2; j++)
 // f[i] = (j+1)*(f[i]+f[j]);
 }
 printf("%lld\n", f[n]);
 }
 return 0;
}
/**************************************************************
 Problem: 1451
 User: liangrx06
 Language: C
 Result: Accepted
 Time:0 ms
 Memory:912 kb
****************************************************************/

1452

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

#define N 2000

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

int main()
{
    int i, j;
    int n, k, w[N+1];
    int dp[2][N+1];

    while (scanf("%d%d", &n, &k) != EOF)
    {
        for (i=1; i<=n; i++)
            scanf("%d", &w[i]);
        qsort(w+1, n, sizeof(w[0]), cmp);

        memset(dp[0], 0, sizeof(dp));
        for (i=1; i<=k; i++)
        {
            for (j=2*i; j<=n-2*(k-i); j++)
            {
                dp[i&1][j] = dp[(i-1)&1][j-2] + (w[j]-w[j-1])*(w[j]-w[j-1]);
                if (j > 2*i && dp[i&1][j-1] < dp[i&1][j])
                    dp[i&1][j] = dp[i&1][j-1];
            }
        }
        printf("%d\n", dp[k&1][n]);
    }
    return 0;
}
/************************************************************** Problem: 1452 User: liangrx06 Language: C Result: Accepted Time:30 ms Memory:912 kb ****************************************************************/

1453

//dp二维数组内存消耗较大,如下方法可以大大降低内存使用
#include <stdio.h>
#include <stdlib.h>

#define N 100
#define M 2000
#define OFF M
#define INF (1e8)

int main()
{
    int i, j, k, n, t;
    int x, y;
    int w;
    int zero;
    int dp[2][2*M+1];

    scanf("%d", &t);
    for (k=1; k<=t; k++)
    {
        scanf("%d", &n);
        for (j=-M; j<=M; j++)
            dp[0][j+OFF] = -INF;
        dp[0][0+OFF] = 0;
        zero = 0;
        for (i=1; i<=n; i++)
        {
            scanf("%d", &w);
            if (w == 0)
                zero = 1;
            for (j=-M; j<=M; j++)
            {
                dp[i&1][j+OFF] = dp[(i-1)&1][j+OFF];

                if (j-w >= -M)
                {
                    x = (dp[(i-1)&1][j-w+OFF] + (j-w))/2;
                    y = (dp[(i-1)&1][j-w+OFF] - (j-w))/2;
                    if (x >= 0 && x <= M && y >= 0 && y <= M)
                    {
                        dp[i&1][j+OFF] = (dp[(i-1)&1][j-w+OFF]+w > dp[i&1][j+OFF]) ?
                            (dp[(i-1)&1][j-w+OFF]+w) : dp[i&1][j+OFF];
                    }
                }
                if (j+w <= M)
                {
                    x = (dp[(i-1)&1][j+w+OFF] + (j+w))/2;
                    y = (dp[(i-1)&1][j+w+OFF] - (j+w))/2;
                    if (x >= 0 && x <= M && y >= 0 && y <= M)
                    {
                        dp[i&1][j+OFF] = (dp[(i-1)&1][j+w+OFF]+w > dp[i&1][j+OFF]) ?
                            (dp[(i-1)&1][j+w+OFF]+w) : dp[i&1][j+OFF];
                    }
                }
            }
        }

        printf("Case %d: ", k);
        if (dp[n&1][0+OFF] <= 0)
        {
            dp[n&1][0+OFF] = (zero == 1) ? 0 : -1;
            printf("%d\n", dp[n&1][0+OFF]);
        }
        else
            printf("%d\n", dp[n&1][0+OFF]/2);
    }
    return 0;
}
/**************************************************************
    Problem: 1453
    User: liangrx06
    Language: C
    Result: Accepted
    Time:30 ms
    Memory:912 kb
****************************************************************/

1454

#include <stdio.h>
#include <stdlib.h>

#define N 500
#define M 10000
#define INF (1e8)

typedef struct node {
    int w; //weight
    int v; //value
} Coin;

int main()
{
    int i, j, n, t;
    int e, f;
    Coin c[N];
    int dp[M+1];

    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &e, &f);
        scanf("%d", &n);
        dp[e] = 0;
        for (j=e+1; j<=f; j++)
            dp[j] = INF;
        for (i=0; i<n; i++)
        {
            scanf("%d%d", &c[i].v, &c[i].w);
            for (j=e+c[i].w; j<=f; j++)
            {
                int tmp = dp[j-c[i].w] + c[i].v;
                dp[j] = (tmp < dp[j]) ? tmp : dp[j];
            }
        }
        if (dp[f] == INF)
            printf("This is impossible.\n");
        else
            printf("The minimum amount of money in the piggy-bank is %d.\n", dp[f]);
    }
    return 0;
}
/************************************************************** Problem: 1454 User: liangrx06 Language: C Result: Accepted Time:60 ms Memory:912 kb ****************************************************************/

1455

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

#define N 100
#define M 100

typedef struct node {
    int p;
    int h;
    int c;
} Food;

int main(void)
{
    int t, n, m, i, j, k;
    Food f[M];
    int dp[N+1];

    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &n, &m);
        for (i=0; i<m; i++)
            scanf("%d%d%d", &f[i].p, &f[i].h, &f[i].c);

        memset(dp, 0, sizeof(dp));
        for (i=0; i<m; i++)
        {
            for (j=0; j<f[i].c; j++)
            {
                for (k=n; k>=f[i].p; k--)
                {
                    int tmp = dp[k-f[i].p] + f[i].h;
                    dp[k] = (tmp > dp[k]) ? tmp : dp[k];
                }
            }
        }
        printf("%d\n", dp[n]);
    }

    return 0;
}
/************************************************************** Problem: 1455 User: liangrx06 Language: C Result: Accepted Time:10 ms Memory:912 kb ****************************************************************/

1456

#include <stdio.h>
#include <limits.h>

#define N 51
#define INF (INT_MAX/2)

typedef struct node {
    int x;
    int y;
    int z;
    int s;
    int v;
    int d;
} Point;

int a, b, c;
int tmax;
Point p[N][N][N];
Point *queue[N*N*N+1];
int front, rear;

void initQueue()
{
    front = rear = 0;
}

int isEmpty()
{
    return front == rear;
}

void push(Point *p1)
{
    queue[rear++] = p1;
}

Point *pop()
{
    return queue[front++];
}

void init()
{
    int i, j, k;
    initQueue();
    for (i=0; i<a; i++)
    {
        for (j=0; j<b; j++)
        {
            for (k=0; k<c; k++)
            {
                scanf("%d", &(p[i][j][k].s));
                p[i][j][k].x = i;
                p[i][j][k].y = j;
                p[i][j][k].z = k;
                p[i][j][k].d = INF;
                p[i][j][k].v = p[i][j][k].s;
            }
        }
    }
}

void printDistance()
{
    printf("=====\n");
    for (int i=0; i<a; i++)
    {
        for (int j=0; j<b; j++)
        {
            for (int k=0; k<c; k++)
                printf("%d ", p[i][j][k].d);
            printf("\n");
        }
    }
}

int legal(int x, int y, int z)
{
    return x>=0 && x<a && y>=0 && y<b
        && z>=0 && z<c && (p[x][y][z].s != 1);
}

void BFS(Point *begin, Point *end)
{
    int i;
    begin->v = 1;
    begin->d = 0;
    push(begin);
    int t[6][3] = {{0, 0, 1}, {0, 1, 0}, {1, 0, 0}, {0, 0, -1}, {0, -1, 0}, {-1, 0, 0}};
    while (!isEmpty())
    {
        Point *p1 = pop();
        for (i=0; i<6; i++)
        {
            int nx = p1->x + t[i][0];
            int ny = p1->y + t[i][1];
            int nz = p1->z + t[i][2];
            if (legal(nx, ny, nz) && !p[nx][ny][nz].v)
            { // 此处两个判断的顺序写反了,结果一直runtime error,切记小心!!!
                Point *np = &p[nx][ny][nz];
                np->v = 1;
                np->d = p1->d + 1;
                if (np->d > tmax || np == end)
                    return ;
                push(np);
            }
        }
    }
}

int main()
{
    int n;
    Point *begin, *end;

    scanf("%d", &n);
    while (n--)
    {
        scanf("%d%d%d%d", &a, &b, &c, &tmax);
        init();
        begin = &p[0][0][0];
        end = &p[a-1][b-1][c-1];
        if ( begin->s == 1 || end->s == 1 || a+b+c-3 > tmax)
        {
            printf("-1\n");
            continue;
        }
        BFS(begin, end);
        if (end->d > tmax)
            printf("-1\n");
        else
            printf("%d\n", end->d);
    }
    return 0;
}
/**************************************************************
    Problem: 1456
    User: liangrx06
    Language: C
    Result: Accepted
    Time:30 ms
    Memory:5064 kb
****************************************************************/

1457

#include <stdio.h>

int main()
{
    int S, N, M, s, n, m, count;
    while(scanf("%d%d%d", &S, &N, &M) != EOF)
    {
        if (S == 0)
            break;
        if (N < M)
        {
            int tmp = N;
            N = M;
            M = tmp;
        }

        s = S-N;
        n = N;
        m = 0;
        count = 1;
        while (s != S)
        {
            if (!n)
            {
                s -= N;
                n = N;
                count ++;
            }
            else if (m < M)
            {
                if (n + m >= M)
                {
                    n -= M-m;
                    m = M;
                }
                else
                {
                    m += n;
                    n = 0;
                }
                count ++;
            }
            if (m == M)
            {
                s += m;
                m = 0;
                count ++;
                if (s == n)
                    break;
            }
            //if (count <= 20)
            //  printf("%d %d %d\n", s, n, m);
        }
        if (s == S)
            printf("NO\n");
        else
            printf("%d\n", count);
    }
    return 0;
}
/**************************************************************
    Problem: 1457
    User: liangrx06
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:912 kb
****************************************************************/

1458

#include <stdio.h>

int main()
{
 int i,n;
 long long a[36];
 while(scanf("%d", &n) != EOF)
 {
 a[1] = 2;
 for (i=2; i<=n; i++)
 a[i] = 3*a[i-1] + 2;
 printf("%lld\n", a[n]);
 }
 return 0;
}
/**************************************************************
 Problem: 1458
 User: liangrx06
 Language: C
 Result: Accepted
 Time:0 ms
 Memory:912 kb
****************************************************************/

1459

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

int isPrime(int n)
{
    for (int i=2; i<=sqrt(n); i++)
    {
        if (n%i == 0)
            return 0;
    }
    return 1;
}

int p[40];

void initPrime()
{
    int i;
    p[1] = 0;
    for (i=2; i<32; i++)
    {
        if (isPrime(i))
            p[i] = 1;
        else
            p[i] = 0;
    }
}

void printPrime()
{
    int i, j;
    for (i=1; i<=39; i++)
        printf("%d ", p[i]);
    printf("\n");
}

int b[17][17];

void initBeside()
{
    int i, j;
    for (i=1; i<17; i++)
    {
        b[i][0] = 0;
        for (j=1; j<17; j++)
        {
            if (j!=i && p[i+j])
                b[i][++b[i][0]] = j;
        }
    }
}

void printBeside()
{
    int i, j;
    for (i=1; i<=6; i++)
    {
        int tmp = b[i][0];
        for (j=1; j<=tmp; j++)
            printf("%d ", b[i][j]);
        printf("\n");
    }
}

int n;
int v[17];
int num[17];

void initSet()
{
    memset(v, 0, sizeof(v));
    v[1] = 1;
    num[1] = 1;
}

void printCircle()
{
    int i;
    for (i=1; i<n; i++)
        printf("%d ", num[i]);
    printf("%d\n", num[i]);
}

void set(int k)
{       
    if (k == n)
    {   
        if (p[num[n]+num[1]])
            printCircle();
        return;
    }
    int i;
    int x = num[k];
    int count = b[x][0];
    for (i=1; i<=count; i++)
    {
        int tmp = b[x][i];
        if (tmp > n)
            break;
        if (!v[tmp])
        {   
            num[k+1] = tmp;
            v[tmp] = 1;
            set(k+1);
            v[tmp] = 0;
        }
    }
}

int main(void)
{
    int i;

    initPrime();
    //printPrime();
    initBeside();
    //printBeside();

    int count = 0;
    while (scanf("%d", &n) != EOF)
    {   
        printf("Case %d:\n", ++count);
        initSet();
        set(1);
        printf("\n");
    }

    return 0;
}
/************************************************************** Problem: 1459 User: liangrx06 Language: C Result: Accepted Time:350 ms Memory:932 kb ****************************************************************/

1460

#include <stdio.h>
 
#define N 100
  
char maze[N+1][N+1];
char mark[N+1][N+1];
  
int n, m;
int go[8][2] = {
    {1, 0},
    {-1, 0},
    {0, 1},
    {0, -1},
    {1, 1},
    {1, -1},
    {-1, -1},
    {-1, 1},
};
  
void DFS(int x, int y){
    int i = 0;
    for (i = 0; i < 8; i++){         int nx = x + go[i][0];         int ny = y + go[i][1];            if (nx < 1 || nx > n || ny < 1 || ny > m){
            continue;
        }
  
        if (maze[nx][ny] == '*'){
            continue;
        }
  
        if (mark[nx][ny] == 1){
            continue;
        }
        mark[nx][ny] = 1;
        DFS(nx, ny);
    }
  
    return;
}
  
  
int main()
{
    while(scanf("%d%d", &n, &m) != EOF){
        if (n ==0 && m == 0){
            break;
        }
  
        int i = 0, j = 0;
        for (i = 1; i <= n; i++){             scanf("%s", maze[i] + 1);         }            for (i = 1; i <= n; i++){             for (j = 1; j <= m; j++){                 mark[i][j] = 0;             }         }            int ans = 0;         for (i = 1; i <= n; i++){             for (j = 1; j <= m; j++){                 if (mark[i][j] == 1){                     continue;                 }                 if (maze[i][j] == '*'){                     continue;                 }                 DFS(i, j);                 ans++;             }         }         printf("%d\n", ans);     }     return 0; } /**************************************************************     Problem: 1460     User: liangrx06     Language: C     Result: Accepted     Time:10 ms     Memory:932 kb ****************************************************************/

你可能感兴趣的:(ACM,九度OJ)