九度OJ 1417-1430(4/14)

1417

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

#define N 100
#define M 10000
#define LEN 101

typedef struct node {
    int x;
    int y;
    int d;
} ROAD;

int n;
int pre[N+1];
int count[N+1];
int num;

void init()
{
    for (int i=1; i<=n; i++)
    {
        pre[i] = i;
        count[i] = 1;
    }
    num = n;
}

int find(int i)
{
    while (i != pre[i])
        i = pre[i];
    return i;
}

int combine(int i, int j)
{
    int a = find(i);
    int b = find(j);
    if (a != b)
    {
        if (count[a] > count[b])
        {
            pre[b] = a;
            count[a] += count[b];
            count[b] = 0;
        }
        else
        {
            pre[a] = b;
            count[b] += count[a];
            count[a] = 0;
        }
        num --;
        return 1;
    }
    else
        return 0;
}

int cmp(const void *a, const void *b)
{
    ROAD *x = (ROAD *)a;
    ROAD *y = (ROAD *)b;
    return x->d - y->d;
}

char mods[N][LEN];
int countMods;

int insert(char s[LEN])
{
    int i;
    for (i=0; i<countMods; i++)
    {
        if (strcmp(s, mods[i]) == 0)
            break;
    }
    if (i == countMods)
    {
        strcpy(mods[countMods++], s);
        return countMods;
    }
    return i+1;
}           

int main(void)
{       
    int m, i;
    ROAD r[M];
    char sa[LEN], sb[LEN];
    int max;

    while (scanf("%d%d", &n, &m) != EOF)
    {   
        countMods = 0;
        for (i=0; i<m; i++)
        {
            scanf("%s%s%d", sa, sb, &r[i].d);
            r[i].x = insert(sa);
            r[i].y = insert(sb);
        }
        qsort(r, m, sizeof(r[0]), cmp);
        //for (i=0; i<m; i++)
        // printf("%d %d %d\n", r[i].x, r[i].y, r[i].d);

        init();
        max = 0;
        for(i=0; i<m; i++)
        {   
            if(combine(r[i].x, r[i].y))
                max = r[i].d;
            if (num == 1)
                break;
        }

        if (num > 1)
            printf("My God\n");
        else
            printf("%d\n", max);
    }

    return 0;
}   
/************************************************************** Problem: 1417 User: liangrx06 Language: C Result: Accepted Time:100 ms Memory:976 kb ****************************************************************/

1418(未完成)

1419

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

#define M 200

struct doc {
    char s[M+1];
    char slower[M+1];
};

int cmp(const void *a, const void *b)
{
    struct doc *c = (struct doc *)a;
    struct doc *d = (struct doc *)b;
    return strcmp(c->slower, d->slower);
}

int main()
{
    int i, j, n;
    struct doc d[M];
    while(scanf("%d\n", &n) != EOF)
    {
        for (i=0; i<n; i++)
        {
            gets(d[i].s);
            for (j=0; d[i].s[j]; j++)
                d[i].slower[j] = tolower(d[i].s[j]);
            d[i].slower[j] = '\0';
        }
        qsort(d, n, sizeof(d[0]), cmp);
        for (i=0; i<n; i++)
            printf("%s\n", d[i].s);
    }
    return 0;
}

/************************************************************** Problem: 1419 User: liangrx06 Language: C Result: Accepted Time:50 ms Memory:932 kb ****************************************************************/

1420

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

int n, k;
int fruit[100], used[100]; 
int total, half;

void dfs(int x, int y) 
{
    int i;
    if (y > half) 
        return;
    if (y > k) 
        k = y;
    if (k == half) 
        return;
    for (i = x; i < n; i++)
    {
        if (!used[i]) {
            used[i] = 1;
            dfs(i + 1, y + fruit[i]);
            used[i] = 0;
        }                       
    }
}                                               

int main() {                                                
    int i;                                                          
    while(scanf("%d", &n) != EOF) 
    {
        total = 0;                                                                  
        for(i = 0;i < n; i++) 
        {
            scanf("%d", &fruit[i]);                                                    
            total += fruit[i];
        }                                                                              
        k = -1;
        half = total >> 1;                                                             
        memset(used, 0, sizeof(used));
        dfs(0, 0);                                                                     
        printf("%d\n", total- k * 2);
    }                                                                                  
    return 0;
}
/************************************************************** Problem: 1420 User: liangrx06 Language: C Result: Accepted Time:50 ms Memory:916 kb ****************************************************************/

1421(未完成)

1422

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

#define N 1000000
#define INF INT_MAX

int a[N+2], left[N+2], li[N+2], right[N+2], ri[N+2];

int main(void)
{
    int t, n, i, j;

    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        for(i=1; i<=n; i++)
            scanf("%d", &a[i]);
        left[0] = a[0] = INF;
        li[0] = 0;
        right[n+1] = a[n+1] = INF;
        ri[n+1] = n+1;

        for (i=1; i<=n; i++)
        {
            if (a[i-1] < a[i])
            {
                left[i] = a[i-1];
                li[i] = i-1;
            }
            else if (left[i-1] < a[i])
            {
                left[i] = left[i-1];
                li[i] = li[i-1];
            }
            else
            {
                left[i] = INF;
                li[i] = 0;
                for (j=li[i-1]-1; j>=1; j--)
                {
                    if (a[j] < a[i])
                    {
                        left[i] = a[j];
                        li[i] = j;
                        break;
                    }
                }
            }
        }
        for (i=n; i>=1; i--)
        {
            if (a[i+1] < a[i])
            {
                right[i] = a[i+1];
                ri[i] = i+1;
            }
            else if (right[i+1] < a[i])
            {
                right[i] = right[i+1];
                ri[i] = ri[i+1];
            }
            else
            {
                right[i] = INF;
                ri[i] = n+1;
                for (j=ri[i+1]+1; j<=n; j++)
                {
                    if (a[j] < a[i])
                    {
                        right[i] = a[j];
                        ri[i] = j;
                        break;
                    }
                }
            }
        }
        /*
        for (i=1; i<=n; i++)
            printf("%d ", left[i]);
        printf("\n");
        for (i=1; i<=n; i++)
            printf("%d ", right[i]);
        printf("\n");
        */
        for (i=1; i<=n; i++)
        {
            if (i > 1)
                printf(" ");
            if (left[i] == INF && right[i] == INF)
                printf("%d", 0);
            else if (right[i] == INF)
                printf("%d", left[i]);
            else if (left[i] == INF)
                printf("%d", right[i]);
            else if (i - li[i] <= ri[i] - i)
                printf("%d", left[i]);
            else
                printf("%d", right[i]);
        }
        printf("\n");
    }

    return 0;
}
/**************************************************************
    Problem: 1422
    User: liangrx06
    Language: C
    Result: Accepted
    Time:1270 ms
    Memory:20444 kb
****************************************************************/

1423-1430(未完成)

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