这个游戏的规则很简单:每个玩家都带他最喜爱的n位信用卡。然后两位玩家一个一个地将他们的卡上写的数字命名。如果两位数字不相等,则数字较小的玩家将从另一名玩家中轻拍(通常用食指敲击前额)。例如,如果n = 3,Sherlock的卡是123,Moriarty的卡有321号,第一个Sherlock的名字1和Moriarty的名字3,所以Sherlock得到一个轻弹。然后他们都是数字2,所以没有人得到轻弹。最后,Sherlock命名3,而Moriarty命名1并获得轻拂。
当然,Sherlock会按照给予的顺序一个接一个地按诚实地命名数字,而Moriary,作为一个真正的小人,打算作弊。他将按其他顺序命名他的数字(但是,他不会改变每个数字的总数)。例如,如果Moriarty上面可以命名1,2,3,并且根本没有闪光,或者他可以命名2,3和1给Sherlock两个闪光灯。
您的目标是找出Moriarty可以获得的最低可能数量(没有人喜欢轻弹),以及Sherlock可以从Moriarty获得的最大可能数量的轻弹。注意,这两个目标是不同的,并且可以通过使用不同的策略来获得最佳结果。
输入
输入的第一行包含单个整数n(1≤n≤1000) - Sherlock和Moriarty卡将要使用的卡数。
第二行包含n位数 - Sherlock的信用卡号码。
第三行包含n位数 - Moriarty的信用卡号码。
输出
首先打印Moriarty将获得的最小可能数量的轻弹。然后打印Sherlock可以从Moriarty获得的最大可能数量的轻弹。
例
输入
3
123
321
输出
0
2
输入
2
88
00
输出
2
0
注意
第一个样本在问题陈述中详细阐述。在第二个样本中,没有办法Moriarty可以避免两次轻弹。
思路:写完本体之后,发现hdu拿到田忌赛马数据水了,坑人;
第一种情况:从起点贪心,遇到a[i]<b[i]时,果断让a[i]消耗b最大的值,之需保证输的少即可;
第二种情况:从末端贪心,田忌赛马的思想;(hdu那道数据水了)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define max_n 1010
using namespace std;
int a[max_n],b[max_n];
char str1[max_n],str2[max_n];
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
getchar();
scanf("%s",str1);
getchar();
scanf("%s",str2);
for(int i=0;i<n;i++)
{
b[i]=str1[i]-'0';
a[i]=str2[i]-'0';
}
if(n==1)
{
if(a[0]>b[0])
printf("0\n1\n");
else printf("1\n0\n");
continue;
}
sort(a,a+n);
sort(b,b+n);
//for(int i=0;i<n;i++)
// printf(" %d",b[i]);
//printf("\n");
//for(int i=0;i<n;i++)
// printf(" %d",a[i]);
//printf("\n");
int lose=0,win=0,t=0,tj=n-1,g=0,gw=n-1,ans=0;
for(;t<=tj;)
{
if(a[t]>=b[g])
{
t++;
g++;
}
else if(a[t]<b[g])
{
ans++;
t++;
gw--;
}
}
lose=0,win=0,t=0,tj=n-1,g=0,gw=n-1;
for(;t<=tj;)
{
if(a[tj]>b[gw])
{
win++;
tj--;
gw--;
}
else if(a[tj]<b[gw])
{
lose++;
t++;
gw--;
}
else if(a[tj]==b[gw])
{
if(a[t]>b[g])
{
t++;
g++;
win++;
}
else if(a[t]<b[g])
{
lose++;
t++;
gw--;
}
else if(a[t]==b[g])
{
if(a[t]==b[gw])
{
t++;
gw--;
}
else
{
lose++;
t++;
gw--;
}
}
}
}
printf("%d\n%d\n",ans,win);
}
return 0;
}