日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4864 贪心

發布時間:2025/6/17 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 贪心的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。