『算法-ACM 竞赛-POJ』3614 防晒霜 这个贪心有点东西(贪心+优先队列)
这个题是说有 C 头牛去晒太阳,带了 L 瓶防晒霜,每瓶防晒霜都有一个 SPF 值(每瓶防晒霜都能解决一个最短路 )
每头牛给出了他可以接受防晒霜的上限,和下限,每种防晒霜都给出了 SPF 值与数量。
从防晒霜的 spf 值最小开始贪心,每次将奶牛最大接受限度小的牛且符合条件选出,那么这头牛一定比其他牛接受范围更小,应该优先选择。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <bits/stdc++.h> using namespace std; const int maxn=3000; struct cow { int maxi; int mini; bool operator <(const cow & w)const { if(maxi==w.maxi) return mini<w.mini; return maxi>w.maxi; } bool operator ==(const cow & w)const { if(maxi==w.maxi&&mini==w.mini) return 1; return 0; } } w ; struct spf { int sp; int nu; bool operator <(const spf& w)const { return sp>w.sp; } } x; int n,m,ans; priority_queue<spf> s; cow c[maxn]; priority_queue<cow>cw; int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>c[i].mini>>c[i].maxi; for(int i=0;i<m;i++) cin>>x.sp>>x.nu,s.push(x);
while(!s.empty()) { spf tem=s.top(); s.pop(); while(!cw.empty())cw.pop(); for(int i=0;i<n;i++) { if(c[i].mini<=tem.sp&&c[i].maxi>=tem.sp) cw.push(c[i]); } if(!cw.empty()){ cow temp=cw.top(); c[find(c,c+n,temp)-c].maxi=-99; ans++; tem.nu--; if(tem.nu!=0) s.push(tem); } else ; if(ans==n) break; } cout<<ans<<endl; }
|