hdu4864 贪心
生活随笔
收集整理的這篇文章主要介紹了
hdu4864 贪心
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意: ? ?
? ?給你n太機器,m個任務,每個任務和機器都有兩個權值x,y,每個機器只能被一個任務使用,條件是機器的兩個權值分別比任務的大于等于,每個任務獲得的價值是x*500+y*2,問你最多能完成多少任務,在完成任務最多的條件下,最多能獲得多少價值。
思路:?
? ? ? 一開始沒想到是貪心,我讀完題第一感覺就是費用流啊!后來一看數據,費用流不行(如果數據小點費用流果斷能簡單處理),后來別人說是貪心,我很不理解,貪心如果只是求最大的個數我可以求,也可以理解,但怎么保證最大價值呢?蛋疼,怪我沒有注意那個公式v = x*500 + y * 2 哎!,sb了,人家不可能隨便給你個式子啊,y的范圍是<=100的,也就是說y怎么樣也沒有x變化1價值增加的多,所以我們要優先保護x,所以在二級排序的時候先以x,在y,這樣就可以在保證個數最大的情況下價值最大了,整個過程還是簡單貪心,排
序的條件是這樣的
return a.x>b.x || a.x==b.x&&a.y>b.y || a.x==b.x && a.y==b.y &&a.v>b.v
v是我自己虛擬出來的,機器是1,任務是0,為了吧機器放在前面
然后for循環處理,從大到小,每個任務都要被他前面的機器中能處理他中y最小的那個處理。更新到最后就行了。
#include<stdio.h> #include<string.h> #include<algorithm> #include<set> using namespace std;typedef struct {int x ,y ,v; }NODE;NODE node[220000]; set<int>my_set; int set_num[105];bool camp(NODE a ,NODE b) {return a.x > b.x || a.x == b.x && a.y > b.y || a.x == b.x && a.y == b.y && a.v > b.v; }int main () {int n ,m ,i ;__int64 ans1 ,ans2;while(~scanf("%d %d" ,&n ,&m)){for(i = 1 ;i <= n ;i ++){scanf("%d %d" ,&node[i].x ,&node[i].y);node[i].v = 1;}for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&node[i+n].x ,&node[i+n].y);node[i+n].v = 0;}sort(node + 1 ,node + n + m + 1 ,camp);my_set.clear();my_set.insert(1050); memset(set_num ,0 ,sizeof(set_num));for(ans1 = ans2 = 0 ,i = 1 ;i <= n + m ;i ++){if(node[i].v) {my_set.insert(node[i].y);set_num[node[i].y] ++;}else{int now = *my_set.lower_bound(node[i].y);if(now != 1050){ans1 += (__int64)(node[i].x * 500) + (__int64)(2 * node[i].y);ans2 ++;if(!(--set_num[now]))my_set.erase(now);}}}printf("%I64d %I64d\n" ,ans2 ,ans1);}return 0; }
總結
以上是生活随笔為你收集整理的hdu4864 贪心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4862 费用流(不错)
- 下一篇: hdu4869 费马小+快速幂