pku 2392 space elevator解题报告
算法:首先很容易想到先对3个测试数据的高度进行整体的排序(很显然,结果由最大的高度决定的);然后对每一组测试数据进行01背包dp.那么最优解就出来了。。
不过,我的算法要跑360多ms,我看到很多人都可以0ms,在这问问那些牛人了,怎么达到0ms?
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define M 405
#define N 40005
#define max(a, b) (a > b ? a : b)
int n, dp[N];
typedef struct number
{
int a;
int h;
int c;
}Number;
Number data[M];
int cmp(const void *a, const void *b)
{
return (*(number *)a).a > (*(number *)b).a ? 1 : -1;
}
int main()
{
//freopen("elevator.11.in", "r", stdin);
int i, j, k, C, max;
scanf("%d", &n);
for (i = 0, max = 0; i < n; i++)
{
scanf("%d%d%d", &data[i].h, &data[i].a, &data[i].c);
if (max < data[i].a)
{
max = data[i].a;
}
}
int ans = 0;
qsort(data, n, sizeof(data[0]), cmp);
for (i = 0; i <= max; i++)
{
dp[i] = 0;
}
for (i = 0; i < n; i++)
{
C = data[i].a;
for (j = 0; j < data[i].c; j++)
{
for (k = C; k >= data[i].h; k--)
{
dp[k] = max(dp[k], dp[k - data[i].h] + data[i].h);
if (dp[k] > ans)
{
ans = dp[k];
}
}
}
}
printf("%d/n", ans);
return 0;
}