BZOJ-1707 [Usaco2007 Nov]tanning分配防晒霜(贪心)
作者:互联网
题目描述
有 \(n\) 头奶牛日光浴,第 \(i\) 头奶牛需要 \([L[i],R[i]]\) 强度之间的阳光。防晒霜有 \(m\) 种,第 \(i\) 种防晒霜的防晒强度为 \(s[i]\),每种 \(c[i]\) 瓶,求最多可以满足多少头奶牛进行日光浴。
数据范围:\(1\leq n,m\leq 2500,1\leq L[i]\leq R[i]\leq 1000,1\leq s[i]\leq 1000\)。
分析
按照 \(L[i]\) 递减的顺序把奶牛排序,依次考虑每头奶牛。
对于每头奶牛,扫描一遍所有的防晒霜,在这头奶牛能用的防晒霜里找 \(R[i]\) 值最大的使用。
证明:
考虑贪心策略的作用范围扩展到后续其他奶牛之后产生的影响。每瓶防晒霜是否可用,会被 \(L[i]\) 和 \(R[i]\) 两个条件限制。因为奶牛已被按照 \(L[i]\) 递减排序,所以每一个不低于当前奶牛 \(L[i]\) 值的防晒霜,都不会低于后面其他奶牛的 \(L[i]\)。也就是说,对于当前奶牛可用的任意两瓶防晒霜 \(x\) 和 \(y\),如果 \(s[x]<s[y]\),那么后面其他奶牛只可能出现 \(x,y\) 都能用,\(x,y\) 都不能用或者 \(x\) 能用,\(y\) 不能用这三种情况之一。因此当前奶牛选择 \(R[i]\) 较大的 \(y\) 去使用,对于整体问题的影响显然比选择 \(R[i]\) 较小的 \(x\) 更好。
另外,每头奶牛对答案的贡献至多是 \(1\)。即使让当前这头奶牛放弃日光浴,留下防晒霜给后面的某一头奶牛用,对答案的贡献也不会变得更大。综上所述,尽量满足当前得奶牛,并选择 \(s[i]\) 值尽量大的防晒霜是一个正确的贪心策略。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2510;
struct node1
{
int L,R;
}A[N];
bool cmp1(node1 A,node1 B)
{
return A.L>B.L;
}
struct node2
{
int val,num;
}B[N];
bool cmp2(node2 A,node2 B)
{
return A.val>B.val;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d%d",&A[i].L,&A[i].R);
sort(A+1,A+1+n,cmp1);
for(int i=1;i<=m;i++)
scanf("%d%d",&B[i].val,&B[i].num);
sort(B+1,B+1+m,cmp2);
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(B[j].num>0&&A[i].L<=B[j].val&&B[j].val<=A[i].R)
{
ans++;
B[j].num--;
break;
}
}
}
cout<<ans<<endl;
return 0;
}
标签:val,1707,int,leq,防晒霜,tanning,node1,Nov,奶牛 来源: https://www.cnblogs.com/DestinHistoire/p/13999175.html