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);
}