uva 757
贪心 优先队列
#include <cstdio> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <sstream> #include <string> #include <cstring> #include <algorithm> #include <iostream> #define maxn 110 #define INF 0x7fffffff #define inf 10000000 #define MOD 1000000007 #define ull unsigned long long #define ll long long using namespace std; struct node { int id, f, d; bool operator < (const node& p) const { if(f != p.f) return f < p.f; return id > p.id; //当f相等时 必须序号小的先出队列 } } pp[30]; int n, _time, la[30], ans[30], _max; void init() { memset(ans, 0, sizeof(ans)); memset(la, 0, sizeof(la)); scanf("%d", &_time); _time *= 60; for(int i = 0; i < n; ++ i) scanf("%d", &pp[i].f), pp[i].id = i+1; for(int i = 0; i < n; ++ i) scanf("%d", &pp[i].d); for(int i = 2; i <= n; ++ i) { scanf("%d", &la[i]); la[i] = la[i]*5+la[i-1]; // printf("%d ", la[i]); } // puts(""); } void solve() { priority_queue<node> q; int tem[30], sum; _max = -1000; //_max必须初始化为负值 for(int i = 1; i <= n; ++ i) { while(!q.empty()) q.pop(); memset(tem, 0, sizeof(tem)); sum = 0; for(int j = 0; j < i; ++ j) q.push(pp[j]); int got = _time-la[i]; // printf("*********got:%d\n", got); while(got >= 5) { node tt = q.top(); q.pop(); if(tt.f <= 0) break; sum += tt.f; tt.f -= tt.d; tem[tt.id] += 5; q.push(tt); got -= 5; } if(got > 0) tem[1] += got; //多的时间加到一号湖 if(sum > _max) { // printf("*********%d\n", i); _max = sum; for(int j = 1; j <= n; ++ j) ans[j] = tem[j]; } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); bool flag = false; while(scanf("%d", &n) == 1 && n) { init(); solve(); if(flag) puts(""); //最后一个样例后没空行 else flag=true; printf("%d", ans[1]); for(int i = 2; i <= n; ++ i) printf(", %d", ans[i]); puts(""); printf("Number of fish expected: %d\n", _max); // puts(""); } return 0; }