題目:點擊開啟題目連結
巧妙的貪心。這個問題講了一個沙王(就是DOTA裡面的那貨)要搬家,他有一個V大小的洞,M件裝備,每件裝備有兩個屬性,Ai是永久佔用的空間,搬過來就佔了,Bi是臨時佔用空間,除了滿足洞>=Ai外,還要滿足搬這件裝備時,洞裡的大小大於等於Bi。問能否搬完。
貪心的形式已經很熟了,但這個題的貪心排序開始排序的時候,是按Ai>Bi來排序的,結果WA。
想了想,Bi事實上是在搬完後就移除的,於是按Ai+Bi>A2i+B2i排,依然錯誤。
後來再仔細一想,應該是讓A的永久空間盡量大(因為大東西要先搬,否則小東西多了就沒有空放進去了),但Bi的臨時空間要盡量小,即AI和BI的差要盡量的大,如果差一樣的話應該保證BI盡量的小,因為臨時空間只是門檻,實際是用不到的,所以一定要先過門檻。
#include <iostream>#include <cstring>#include <string>#include <algorithm>using namespace std;class equip{ public: int ai; int bi;};bool cmp(equip a,equip b){if((a.ai+b.bi)!=(b.ai+a.bi))return (a.ai+b.bi)<(a.bi+b.ai);elsereturn a.bi<b.bi;}equip equipment[1005];int main(){int testcase;cin>>testcase;while(testcase--){int holev,eqnum;int pos=1;cin>>holev>>eqnum;for(int i=0;i<eqnum;i++){cin>>equipment[i].ai>>equipment[i].bi;}sort(equipment,equipment+eqnum,cmp);for(int i=0;i<eqnum;i++){if(holev>=equipment[i].ai && holev>=equipment[i].bi){holev-=equipment[i].ai;}else{pos=0;break;}}if(pos==1)cout<<"Yes"<<endl;else if(pos==0)cout<<"No"<<endl;}return 0;}