sunscreen(排序

# 题意
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 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12542923.html