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 |
对ai排序,再多重背包/** * POJ: 2392 Space Elevator * * DP; */ /** ***/ #include <stdio.h> #include <string.h> #include <stdlib.h> /** ***/ #define CNT 400 // K <= 400 #define HGT 40000 // Ai <= 40000 #define SUBMIT 1 /** ***/ typedef struct { int h; // hi int a; // ai int c; // ci } blk_t; blk_t blk[CNT + 1]; int dp[HGT + 1]; // dp[i][j]: 考察前i种Block, 高度j是否能被达到 /** ***/ static inline int max(int a, int b) { return (a > b ? a : b); } /** ***/ int compar(const void *p1, const void *p2) { return ((blk_t *)p1)->a - ((blk_t *)p2)->a; } /** ***/ int main(int argc, char **argv) { #ifndef SUBMIT freopen("input/2392", "r", stdin); #endif int cnt, hgt; int kid, hi, ai, ci; while (1 == scanf("%d", &kid)) { /* init */ cnt = hgt = 0; memset(dp, 0, sizeof(dp)); /* input */ for (int i = 0; i < kid; ++i) { scanf("%d%d%d", &hi, &ai, &ci); if (hi > ai) { continue; } blk[++cnt].h = hi; blk[cnt].a = ai; blk[cnt].c = ci; } /* sort */ qsort(blk + 1, cnt, sizeof(blk_t), compar); /* dp */ dp[0] = 1; // 高度0, 定能达到 for (int i = 1; i <= cnt; ++i) { for (int j = hgt; j >= 0; --j) { // 逆序 // 如若顺序, 某些hgt可能因为Bi而可达到 // 从而导致dp[i - 1][j] 被dp[i][j] 覆盖 if (!dp[j]) { continue; } for (int k = 1, tmp; k <= blk[i].c; ++k) { tmp = j + k * blk[i].h; if (tmp > blk[i].a) { break; } dp[tmp] = 1; hgt = max(hgt, tmp); } } } /* output */ printf("%d\n", hgt); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator