其他分享
首页 > 其他分享> > BZOJ-1707 [Usaco2007 Nov]tanning分配防晒霜(贪心)

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