标签:des style blog http color os io for
1 2 100 3 100 2 100 1
1 50004
解题思路:有n台机器,m个任务,每台机器有xi,yi,每个任务也有xj,yj,当一个任务可以被处理的条件是,xj<=xi 且 yj<yi,处理完产生 500*xj+2*yj 的价值,问你最多产生的价值是多少?
解题代码:注意y的范围是 y<100,也就是x相差1,y不管相差多少价值都很少。
根据贪心的做法,肯定从高价值物品生产也就是按x排好序,再贪心,高价值的物品只需要在x比它大的所有机器中选择y满足条件的最小的那个(这个思考一下)
#include <iostream>
#include <set>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=110000;
struct node{
int x,y;
friend bool operator < (node a, node b){
if(a.y!=b.y) return a.y<b.y;
else return a.x<b.x;
}
};
int n,m;
node a[maxn],b[maxn];
bool cmp(node a,node b){
if(a.x!=b.x) return a.x>b.x;
else return a.y>b.y;
}
void solve(){
multiset <node> mys;
sort(a,a+n,cmp);
sort(b,b+m,cmp);
int r=0,cnt=0;
long long ans=0;
for(int i=0;i<m;i++){
while(r<n && a[r].x>=b[i].x) mys.insert(a[r++]);
multiset <node>::iterator it=mys.lower_bound(b[i]);
if(it!=mys.end()){
mys.erase(it);
cnt++;
ans+=b[i].x*500+b[i].y*2;
}
}
cout<<cnt<<" "<<ans<<endl;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=0;i<m;i++) scanf("%d%d",&b[i].x,&b[i].y);
solve();
}
return 0;
}
HDU 4864 Task(基本算法-贪心),布布扣,bubuko.com
标签:des style blog http color os io for
原文地址:http://blog.csdn.net/a1061747415/article/details/38335069