| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我提交了15次了。。。现在TLE……In Reply To:我比你还郁闷!!你看一下我的成绩就知道了,我交了四十次,硬是没有AC的~~我编到快吐了 Posted by:winboycool at 2007-04-21 14:28:33 #include <stdio.h>
#include <stdlib.h>
#define SMX 100
#define MAX(x, y) ((x) > (y)) ? (x) : (y)
int N, len, stick[SMX];
int cmp(const void *a, const void *b) {
return((*(int *)b) - (*(int *)a));
}
int can_alloc(int n) {
int i, j, l = len, s = 0, bs = 0, fin, tot = 0, sublen = len / n, alloc[SMX], step[SMX], total[SMX], begin[SMX];
for(i = 0; i < N; alloc[i] = step[i] = total[i] = begin[i] = 0, i++);
while(l) {
for(i = step[s], j = 0, tot = total[s], fin = 0; i < N; i++) {
if(tot == 0)
begin[bs] = s;
if(alloc[i] == 0 && stick[i] <= sublen - tot) {
alloc[i] = 1;
tot += stick[i];
step[s] = i;
total[s] = tot;
l -= stick[i];
s++;
step[s] = 0;
total[s] = 0;
}
if(tot == sublen) {
begin[++bs] = 0;
fin = 1;
break;
}
}
if(!fin) {
if(s <= 0)
return(0);
else
while(--s) {
l += stick[step[s]];
total[s] -= stick[step[s]];
alloc[step[s]] = 0;
if(s == begin[bs])
continue;
else {
if(s < begin[bs])
begin[bs--] = 0;
for(j = step[s] + 1; j < N && stick[j] == stick[step[s]]; j++);
if(j >= N)
continue;
else
step[s] = j;
break;
}
}
}
}
return(1);
}
int main() {
int n, max;
while(1) {
fscanf(stdin, "%d", &N);
if(N == 0)
break;
for(n = 0, len = 0, max = 0; n < N; n++) {
fscanf(stdin, "%d", &stick[n]);
len += stick[n];
max = MAX(max, stick[n]);
}
qsort(stick, N, sizeof(int), cmp);
for(n = N / 2 + 1; n > 1; n--) {
if(len % n > 0 || len / n < max)
continue;
if(can_alloc(n)) {
printf("%d\n", len / n);
break;
}
}
if(n == 1)
printf("%d\n", len);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator