bzoj 1034 [ZJOI2008]泡泡堂BNB——贪心

时间:2023-03-09 16:39:03
bzoj 1034 [ZJOI2008]泡泡堂BNB——贪心

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1034

原来觉得和 bzoj4977跳伞求生 有点像(虽然还没做)。

所以对于a[ ]从小到大来看,如果能赢b[ ]的最小的,就赢,不然就算了。

经Zinn看TJ后发现a[ ]如果不能匹配的话,应该把b[ ]的最大的匹配掉。就像田忌赛马一样。还可以从大到小地看。

如果较大的a[ ] <= b[ ]的话,看看较小的a[ ],如果小a[ ] > b[ ],本次先让小a[ ]匹配;如果小a[ ] == b[ ],让大a[ ]和小b[ ]匹配;如果小a[ ] < b[ ],就让小a[ ]和大b[ ]匹配。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
int n,a[N],b[N],p0,p1,tp0,tp1,ans;
int rdn()
{
int ret=;char ch=getchar();
while(ch>''||ch<'')ch=getchar();
while(ch>=''&&ch<='')(ret*=)+=ch-'',ch=getchar();
return ret;
}
int main()
{
n=rdn();
for(int i=;i<=n;i++)a[i]=rdn();
for(int i=;i<=n;i++)b[i]=rdn();
sort(a+,a+n+);sort(b+,b+n+);
p0=tp0=n;p1=tp1=;
while(p1<=p0)
{
if(a[p0]>b[tp0])p0--,tp0--,ans+=;
else if(a[p1]>b[tp1])p1++,tp1++,ans+=;
else {if(a[p1]==b[tp0])ans++;tp0--;p1++;}
}
printf("%d ",ans);ans=;
p0=tp0=n;p1=tp1=;
while(p1<=p0)
{
if(b[p0]>a[tp0])p0--,tp0--;
else if(b[p1]>a[tp1])p1++,tp1++;
else {if(b[p1]==a[tp0])ans--;tp0--;p1++;ans+=;}
}
printf("%d\n",ans);
return ;
}