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 |
用优先队列的V*N的算法竟然要63ms,求优化!#include <stdio.h> #include <string.h> #define MAX_CASH 100002 #define MAX 12 int d[MAX]; int count[MAX]; int used[MAX_CASH]; int cash[MAX_CASH]; int v; // priority queue typedef struct { int pos; int val; } Entry; Entry queue[MAX_CASH]; int start, end, window; static inline void insert_queue(int val, int pos) { while ( start < end && queue[end-1].val <= val) { end--;} queue[end].pos = pos; queue[end++].val = val; while ((queue[start].pos + window) <= pos) start++; } static inline int get_max_from_queue() { return queue[start].val; } int main() { int n, i, j; while (scanf("%d %d", &v, &n) != EOF) { for (i = 1; i <= n; i++) { scanf("%d %d", &count[i], &d[i]); } for (i = 0; i <= v; i++) { cash[i] = 0; } for (i = 1; i <= n; i++) { // reinit the priority-queue int w = d[i]; start = end = 0; window = count[i] + 1; // try put for (j = 0; j < w; j++) { int m, cur = j; for (m = 0; cur <= v; m++, cur += w) { // insert cash[cur] - m*w insert_queue(cash[cur] + j - cur, m); // assign it with max + m*w cash[cur] = get_max_from_queue() + cur - j; } } } printf("%d\n", cash[v]); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator