| ||||||||||
| 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 | |||||||||
我就无语了,用迭代加深TLE,直接dfs反而32msAC??求大牛指教。直接dfs版:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N = 60;
const int M = 1000;
struct node
{
int start, interval, times;
}path[M];
int n, ans, tot, ct[N];
int cmp(const void *a, const void *b)
{
node *aa, *bb;
aa = (node *)a;
bb = (node *)b;
return bb->times - aa->times;
}
bool check(int s, int t)
{
int i;
for(i = s; i < N; i += t)
if(!ct[i])
return false;
return true;
}
void dfs(int index, int sum)
{
int i, j, tmp, k;
if(n == 0)
{
if(sum < ans) ans = sum;
return;
}
for(i = index; i<tot && path[i].times>n; i++);
for(k = i; k < tot; k++)
{
if(sum+n/path[k].times >= ans) return;
if(check(path[k].start, path[k].interval))
{
tmp = path[k].interval;
for(j = path[k].start; j < N; j += tmp)
{
ct[j]--;
n--;
}
dfs(k, sum+1);
for(j = path[k].start; j < N; j += tmp)
{
ct[j]++;
n++;
}
}
}
}
int main()
{
int i, x, j;
scanf("%d", &n);
memset(ct, 0, sizeof(ct));
for(i = 0; i < n; i++)
{
scanf("%d", &x);
ct[x]++;
}
tot = 0;
for(i = 0; i <= 29; i++)
{
if(!ct[i]) continue;
for(j = i+1; j <= 59-i; j++)
if(check(i, j))
{
path[tot].start = i;
path[tot].interval = j;
path[tot].times = 1 + (59-i)/j;
tot++;
}
}
qsort(path, tot, sizeof(path[0]), cmp);
ans = 17;
dfs(0, 0);
printf("%d\n", ans);
return 0;
}
迭代加深版(做了一点小修改):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N = 60;
const int M = 1000;
struct node
{
int start, interval, times;
}path[M];
int n, ans, tot, dd, ct[N];
int cmp(const void *a, const void *b)
{
node *aa, *bb;
aa = (node *)a;
bb = (node *)b;
return bb->times - aa->times;
}
bool check(int s, int t)
{
int i;
for(i = s; i < N; i += t)
if(!ct[i])
return false;
return true;
}
void dfs(int index, int sum)
{
int i, j, tmp, k;
if(n == 0)
{
ans = sum;
return;
}
if(sum == dd) return;
for(i = index; i<tot && path[i].times>n; i++);
for(k = i; k < tot; k++)
{
if(sum+n/path[k].times >= ans) return;
if(check(path[k].start, path[k].interval))
{
tmp = path[k].interval;
for(j = path[k].start; j < N; j += tmp)
{
ct[j]--;
n--;
}
dfs(k, sum+1);
if(ans == dd) return;
for(j = path[k].start; j < N; j += tmp)
{
ct[j]++;
n++;
}
}
}
}
int main()
{
int i, x, j;
scanf("%d", &n);
memset(ct, 0, sizeof(ct));
for(i = 0; i < n; i++)
{
scanf("%d", &x);
ct[x]++;
}
tot = 0;
for(i = 0; i <= 29; i++)
{
if(!ct[i]) continue;
for(j = i+1; j <= 59-i; j++)
if(check(i, j))
{
path[tot].start = i;
path[tot].interval = j;
path[tot].times = 1 + (59-i)/j;
tot++;
}
}
qsort(path, tot, sizeof(path[0]), cmp);
ans = 17;
dd = 0;
while(dd != ans)
{
dd++;
dfs(0, 0);
}
printf("%d\n", ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator