题解:P11789 [JOI 2019 Final] 画展 / Exhibition

· · 题解

题意

已经很清楚了,不讲。

具体怎么做

考虑贪心。设最多可以展出 x 幅画。

x 幅画所用的画框一定是用最大的 x 个画框。

对于画而言,因为还有一个美观度的限制,所以大的画框一定要装美观度尽可能大的画。对于美观度相同的一些画,显然将较大的画装入较大的画框中。

:::info[证明]

:::

因此,画框要从大到小排序,画以美观度为第一关键字,大小为第二关键字从大到小排序。

用双指针维护贪心过程。设当前尝试第 i 大的画框匹配第 j 幅画。若因画太大而匹配失败,则 j\gets j+1 并重新匹配。若匹配成功,则 ans\gets ans+1,i\gets i+1,j\gets j+1

:::success[正确代码]

#include<bits/stdc++.h>
using namespace std;
struct picture{int s,v;}a[114514];
int n,m,c[114514],ans;
bool cmp(picture a,picture b){return a.v==b.v?a.s>b.s:a.v>b.v;}
bool cmp2(int a,int b){return a>b;}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;scanf("%d%d",&a[i].s,&a[i].v),++i);
    for(int i=1;i<=m;scanf("%d",&c[i]),++i);
    sort(a+1,a+n+1,cmp);sort(c+1,c+m+1,cmp2);
    for(int i=1,j=1;i<=m&&j<=n;++j)if(c[i]>=a[j].s)++ans,++i;
    printf("%d",ans);
}

:::