# 题意
c头牛,第 i 头可以接收的阳光范围为min[ i ] , max[ i ],每头牛必须涂抹防晒霜,一共有L种,第 i 种可以让牛接收的阳光稳定在spf[i],有cover[ i ] 瓶。
问最多可以有多少头牛晒日光浴
# 题解
算法流程
1) 将所有奶牛按照min从大到小排序,然后一次考虑每头奶牛
2) 对于每头奶牛,扫描当前所有能用的防晒霜,选择值最大的防晒霜来使用
每一瓶spf是否可用,只会被min和max两个条件限制。
因为奶牛按照min递减排序,所以每一个不低于当前奶牛min的spf都不会低于后面的,也就是任意两瓶防晒霜x和y,且spf[ x ]<spf[ y ]后面只可能出现x和y都能用,x和y都不能用或x能用,y不能用,这三种情况,因此奶牛选择spf较大的y去使用,对于整体问题的影响显然比选择较小的x要好
每头奶牛对答案的贡献最多是1,即使让当前放弃,后面使用,对答案的贡献也不会变大。
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define ld long double 4 #define fi first 5 #define se second 6 #define pii pair<int,int> 7 using namespace std; 8 const int N=2510; 9 pii fs[N]; 10 pii cow[N]; 11 int n,m; 12 bool cmp(pii a,pii b){ 13 return a.fi >b.fi; 14 } 15 int main(){ 16 ios::sync_with_stdio(0); 17 cin.tie(0); 18 cout.tie(); 19 20 cin>>n>>m; 21 int ans=0; 22 for(int i = 1; i <= n; i++) 23 cin >> cow[i].fi >> cow[i].se; 24 for(int i = 1; i <= m; i++) 25 cin >> fs[i].fi >> fs[i].se; 26 27 sort(cow+1,cow+n+1,cmp); 28 sort(fs+1,fs+m+1,cmp); 29 30 for(int i = 1; i <= n; i++) 31 for(int j = 1; j <= m; j++){ 32 if(fs[j].se && fs[j].fi >= cow[i].fi && fs[j].fi <= cow[i].se) { 33 ans++; 34 fs[j].se--; 35 break; 36 } 37 } 38 39 cout<<ans<<endl; 40 }