标签:
开启新贪心
提议,给定n台机器,m个任务。需要在机器满足时间充足并且等级允许的情况下,进行每台机器的任务选择。最终需要效益最大化。
首先任务的价值vt = 500 * x + 2 * y;y <= 100。
所以,x将决定任务最终的价值。
这道题想法很简单,但是鉴于100000的测试数据量真的很恐怖。所以,关键在于是否可以在效率上解决这个问题。
1、首先根据x进行排序,x相同时,按照y由大到小排序。为了将来选择的标记时,每个可以任务可以选择的机器范围是逐渐扩大的做好准备。
2、机器选择。针对每一个任务的时间消耗满足是能够解决所有难度级别数进行统计。记录下来那些级别可以进行处理;
3、对于已经可以选择的机器,进行削减,主要是找当前已经确认可以满足时间中难度级别最低的进行削减。此时不用担心削减的是不是时间最合适的。削减的就是当时可以hi用的任意一个。因为后面面对的任务,耗时越来越少,能满足这个的,后面一定也可以选择。减掉这个级别的可用机器数量。然后进行报酬计算累加即可。
#include <iostream> #include <algorithm> #include <cstring> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; struct work { int x; int y; }; work a[100005], b[100005]; bool my_cmp(work q, work h) { if (q.x > h.x || q.x == h.x && q.y > h.y) return true; else return false; } int main(int argc, char** argv) { int v[105]; int n, m, i, j, k; long long sum; int count; while (cin >> n >> m) { for (i = 1; i <= n; i++) cin >> a[i].x >> a[i].y; for (i = 1; i <= m; i++) cin >> b[i].x >> b[i].y; sort(a + 1, a + n + 1, my_cmp); sort(b + 1, b + m + 1, my_cmp); memset(v, 0, sizeof(v)); sum = count = 0; for (i = 1, j = 1; i <= m; i++) { while(j <= n && a[j].x >= b[i].x) { v[a[j].y]++; j++; } for (k = b[i].y; k <= 100; k++) { if (v[k] > 0) { v[k]--; count++; sum += (500 * b[i].x + 2 * b[i].y); break; } } } cout << count << " " << sum << endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/fatship/p/5744160.html