[HDOJ 4864] Task [贪心]

来源:互联网 发布:java和c哪个难 编辑:程序博客网 时间:2024/05/24 04:17

现有n个机器和m个任务,每个机器有最大运行时间和等级,每个任务有需要运行时间和等级。一个机器只能运行一个任务,一个任务也仅能被一个机器运行,不能拆开由多个机器运行。每个机器只能运行等级和需要时间都小于等于它的任务。问最多可以运行多少个任务?在此前提下,最多可以得到多少分?

由于分数的公式是500*运行时间+2*等级,而且等级最大为100,所以相当于运行时间为第一关键字,等级为第二关键字

贪心,将机器和任务都排序,对于每个机器,按照等级从底到高的顺序,执行它可以执行的分数最高的任务即可。

#include <cstdio>#include <cstring>#include <set>#include <algorithm>using namespace std;struct PP {int x,y;friend bool operator < (const PP &a,const PP &b) {return a.y<b.y;}};PP task[100101];PP mach[100101];struct SETPP {int i;SETPP() {}SETPP(int ii) {i=ii;}friend bool operator < (const SETPP &a,const SETPP &b) {//printf("%d %d %d %d %d %d\n",a.i,task[a.i].x,task[a.i].y,b.i,task[b.i].x,task[b.i].y);if (task[a.i].x!=task[b.i].x) return task[a.i].x>task[b.i].x;return task[a.i].y>task[b.i].y;}};multiset <SETPP> c;int n,m;int main() {int i,j,ansn;long long ans;while (scanf("%d%d",&n,&m)!=EOF) {for (i=0;i<n;i++) {scanf("%d%d",&mach[i].x,&mach[i].y);}for (i=0;i<m;i++) {scanf("%d%d",&task[i].x,&task[i].y);}sort(mach,mach+n);sort(task,task+m);j=0;ans=0;ansn=0;c.clear();for (i=0;i<n;i++) {while (j<m&&task[j].y<=mach[i].y) {c.insert(SETPP(j));j++;}multiset <SETPP> :: iterator k;//for (multiset <SETPP> :: iterator it=c.begin();it!=c.end();it++) {//printf("%d\n",it->i);//}task[m]=mach[i];k=c.lower_bound(SETPP(m));if (k!=c.end()) {ans+=500ll*task[k->i].x+2*task[k->i].y;c.erase(k);ansn++;}}printf("%d %I64d\n",ansn,ans);}return 0;}


0 0