【贪心】Sunscreen(poj 3614/luogu 2887)
生活随笔
收集整理的這篇文章主要介紹了
【贪心】Sunscreen(poj 3614/luogu 2887)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Sunscreen
poj 3614
luogu 2887
題目大意:
有n個人,每個人要求選一個價值在minniminn_iminni?到maxximaxx_imaxxi?的物品,現在有m件物品,每件的價值是spfispf_ispfi?,可以選covericover_icoveri?次,問最多可以滿足多少個人的要求
輸入樣例
3 2 3 10 2 5 1 5 6 2 4 1輸出樣例
2數據范圍
1≤N,M≤25001 ≤N, M ≤ 25001≤N,M≤2500
1≤minSPFi≤maxSPFi≤1,0001 ≤ minSPFi ≤ maxSPF_i ≤ 1,0001≤minSPFi≤maxSPFi?≤1,000
解題思路:
先按每個人的minn按從大到小排一遍序,然后每個人都盡量選價值大的物品然后計算結果即可
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,num,ans; struct rec {int minn,maxx; }s[3000]; struct recc {int spf,cover; }S[3000]; bool cmp(rec x,rec y){return x.minn>y.minn;}//從大到小 bool cmpp(recc x,recc y){return x.spf>y.spf;}//從大到小 int main() {scanf("%d %d",&n,&m);for(int i=1;i<=n;++i)scanf("%d %d",&s[i].minn,&s[i].maxx);for(int i=1;i<=m;++i)scanf("%d %d",&S[i].spf,&S[i].cover);sort(s+1,s+1+n,cmp);//排序sort(S+1,S+1+m,cmpp);for (int i=1;i<=n;++i){num=0;for(int j=1;j<=m;++j)if(S[j].cover&&S[j].spf<=s[i].maxx&&S[j].spf>=s[i].minn)//可以選{num=j;//選break;} if(num){S[num].cover--;//數量減一ans++;//結果加一}}printf("%d",ans); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【贪心】Sunscreen(poj 3614/luogu 2887)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 表格中的斜线怎么弄 表格里的三斜线怎么弄
- 下一篇: 【贪心】Stall Reservatio