这题和田忌赛马类似,我做这题的时候,被卡了2个小时,还是太菜了。
题目要求的是第二个人输的最小次数和第一个人输的最多次数。
求第二个人输的最小次数,正面不好求,可以通过反 面来求,即求第二个人打赢和打平第一个人的最大次数,用总比赛次数减去即可。然后求第一个人输的最多次数,就是相当于求第二个人赢的最多次数。
#include<bits/stdc++.h>
using namespace std;
char s[1005];
int a[1005],b[1005];
int main()
{
int n,ans1=0;
cin>>n>>s;
for(int i=0;i<n;i++) a[i]=s[i];
cin>>s;
for(int i=0;i<n;i++) b[i]=s[i];
sort(a,a+n);
sort(b,b+n);
for(int i=0,j=0;i<n&&j<n;)//求第二个人打赢和打平的最大次数
{
while(j<n)
{
if(a[i]<=b[j])//打赢或打平就让下2个数比
{
i++;
j++;
ans1++;
break;
}
else//输了的话i不用动,仍然指向原数,j往后走,找更大的数来和a[i]比
j++;
}
}
cout<<n-ans1<<endl;
ans1=0;
for(int i=0,j=0;i<n&&j<n;)//求第二个人打赢的最大次数,就少判断了一个打平的情况
{
while(j<n)
{
if(a[i]<b[j])
{
i++;
j++;
ans1++;
break;
}
else
j++;
}
}
cout<<ans1<<endl;
return 0;
}