CF777B:Game of Credit Cards(贪心)

  这题和田忌赛马类似,我做这题的时候,被卡了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;


}
原文地址:https://www.cnblogs.com/eason9906/p/11754902.html