AISD: pracownia D

Testy

Wyniki

Rozwiązanie (dude)

Runtime error na ostatnim. Rozwiazanie nie jest optymalne.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define CARMAX  100000
 
int i;
struct car {
        int     x;
        int     y;
        int     c;
} cars[CARMAX];
int path[CARMAX];
int dupa[CARMAX];
 
int cmp(struct car *a, struct car *b)
{
        return a->x != b->x ? a->x - b->x : a->y - b->y;
}
 
struct ll {
        struct ll       *prev;
        struct ll       *next;
        int             num;
        int             car;
        int             index;
} *list, *previous;
 
void dellt(struct ll *l, int c)
{
        struct ll       *tl;
        struct ll       *start = l;
        l = l->next;
        while (l) {
                if (c > l->car) {
                        tl = l->next; 
                        free(l);  
                        l = tl; 
                } else if (c <= l->car) {
                        l->prev = start;
                        start->next = l;
                        return;
                }
        }
        start->next = NULL;
}
 
void ins(int n, int c) {
        struct ll       *l = list;
        struct ll       *new;
        struct ll       *lt;
        if (previous && previous->num < n) {
                l = previous;
        }
 
        new             = malloc(sizeof(struct ll));
        new->num        = n;
        new->car        = c;
        new->index      = i;
        if (l == NULL) {
                new->next       = NULL;
                new->prev       = NULL;
                path[i]         = -1;
                list            = new;
                return;
        }
        while (l) {
                if (l->num == n) {
                        int     a = -1,
                                b = l->car;
                        if (l->prev)
                                a = l->prev->car;
                        if (a > b) {
                                l->car = c + a;
                                path[i] = l->prev->index; /* tu blad czasami powodujacy segfault */
                        } else {
                                l->car = c + b;
                                path[i] = l->index;
                        }
                        l->index = i;
                        dellt(l, l->car);
                        free(new); 
                        previous = l;
                        return;
                } else if (l->num > n) {
                        new->prev       = l->prev;
                        new->next       = l;
                        l->prev         = new;
                        if (new->prev) {
                                new->prev->next = new;
                                new->car += new->prev->car;
                                path[i] = new->prev->index;
                        } else {
                                list = new;
                                path[i] = -1;
                        }
                        dellt(new, new->car);
                        previous = new;
                        return;
                } else {
                        lt = l;
                        l = l->next;
                }
        }
        new->next = NULL;
        new->prev = lt;
        lt->next = new;
        if (new->prev) {
                path[i] = new->prev->index;
                new->car += new->prev->car;
        } else {
                path[i] = -1;
        }
        previous = new;
}
 
#define READ_INT(n)     n = 0; while((ch = getchar_unlocked()) >= '0') n = n * 10 + ch - '0';
int main()
{
        int m, n, k;
        char ch;
 
        /* scanf("%d %d %d", &m, &n, &k); */
        READ_INT(m);
        READ_INT(n);
        READ_INT(k);
        memset(path, -1, CARMAX*4);
        for (i = 0; i < k; i++) {
                READ_INT(cars[i].x);
                READ_INT(cars[i].y);
                READ_INT(cars[i].c);
                /* scanf("%d %d %d", &cars[i].x, &cars[i].y, &cars[i].c); */
        }
        qsort(cars, k, sizeof(struct car), (int (*)(const void *, const void *))cmp);
 
        for (i = 0; i < k; i++) {
                /* if(!(i % 100)) { printf("%d\n", i);} */
                ins(cars[i].y, cars[i].c); 
        }
        while (list->next) list = list->next;
        m = 0;
        i = list->index;
        while (i != -1) {
                dupa[m] = i;
                i = path[i];
                m++;
        }
        printf("%d\n%d\n", list->car, m);
        while (m > 0) {
                m--;
                printf("%d %d\n", cars[dupa[m]].x, cars[dupa[m]].y);
        }
        return 0;
}
 
aisd/10.pracownia-d.txt · ostatnio zmienione: 2011/05/17 18:19 przez cinkowskiw
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:MIT License
Recent changes RSS feed