1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#include <stdio.h>
#include <stdlib.h>
/* testni program, da vidim, če razumem nalogo */
struct voznik {
int t;
int v;
};
int najdi (int ** sp, int n, int * prijatelji, int * po, int prij) {
int s = 0;
/* preverimo, če smo našli */
for (int i = 0; i < prij; i++) {
if (po[i])
continue;
s++;
for (int j = 0; j < prij; j++) {
if (po[i])
continue;
if (i == j)
continue;
if (!sp[prijatelji[i]][prijatelji[j]] && !sp[prijatelji[j]][prijatelji[i]])
goto n;
}
}
return s;
n:
s = -1;
for (int i = 0; i < prij; i++) {
if (po[i]) /* je bil odstranjen */
continue;
po[i]++;
int ns = najdi(sp, n, prijatelji, po, prij);
po[i]--;
if (ns > s)
s = ns;
}
return s;
}
int spop (int l, struct voznik * i, struct voznik * j) {
return (i->t < j->t && l/i->v+i->t > l/j->v+j->t);
}
int primerjaj_voznike (const void * a, const void * b) {
const struct voznik * c = (const struct voznik *) a;
const struct voznik * d = (const struct voznik *) b;
return c->t - d->t;
}
int main (int argc, char ** argv) {
int l, n, i, s, ** sp, * prijatelji, * po;
char * c, * buf;
struct voznik * vozniki;
buf = malloc(500);
fgets(buf, 500, stdin);
l = strtol(buf, &c, 10);
c++;
n = strtol(c, NULL, 10);
vozniki = calloc(n, sizeof(struct voznik));
sp = calloc(n, sizeof(int *));
prijatelji = calloc(n, sizeof(int));
po = calloc(n, sizeof(int));
for (int i = 0; i < n; i++)
sp[i] = calloc(n, sizeof(int)); /* alloc bi lahko zgolj (n-i)-1 ampak ok */
i = 0;
while (i < n) {
fgets(buf, 500, stdin);
vozniki[i].t = strtol(buf, &c, 10);
c++;
vozniki[i++].v = strtol(c, NULL, 10);
}
qsort(vozniki, n, sizeof(struct voznik), primerjaj_voznike);
for (int i = 0; i < n-1; i++)
for (int j = i+1; j < n; j++)
if (spop(l, vozniki+i, vozniki+j) && !sp[i][j])
sp[i][j]++;
/* debug, tabelica */
for (int i = 0; i < n; i++) {
fprintf(stderr, "%d:", i);
for (int j = 0; j < n; j++)
fprintf(stderr, " %d", sp[i][j]);
fprintf(stderr, "\n");
}
s = 0;
/* sedaj gremo po voznikih in najdemo osebo z največ skupinskimi prijatelji */
for (int v = 0; v < n; v++) {
int sest = 0;
int prij = 1;
prijatelji[0] = v;
/* po vrstici */
for (int j = v+1; j < n; j++)
if (sp[v][j])
prijatelji[prij++] = j;
/* po stolpcu */
for (int i = 0; i < v; i++)
if (sp[i][v])
prijatelji[prij++] = i;
/* rekurzivno odstranjujemo prijatelje dokler ne najdemo najbolj optimalne skupine */
sest = najdi(sp, n, prijatelji, po, prij);
if (sest > s)
s = sest;
}
for (int i = 0; i < n; i++)
free(sp[i]);
free(buf);
free(vozniki);
free(sp);
fprintf(stdout, "%d\n", s);
return 0;
}
|