国庆欢乐赛day5

国庆欢乐赛day5题解

T1 88儿子

$\mathbf{大体思路}$

这道题不仅要按字典序排序,还要按首字母配对。首先是按字典序排序。排序部分还是很简单的,只要用$\mathbf{sort}$函数即可(快速排序)。

代码如下

for(int i=1;i<=n;i++)
     cin>>a[i];//输入父亲的名字
for(int i=1;i<=n;i++)
     cin>>b[i];//输入儿子的名字

sort(a+1,a+n+1);
sort(b+1,b+n+1);//快速排序

接下来的部分才是关键:即$\mathbf{按首字母配对}$。

首先记录首字母(记录到数组$\mathit{la,lb}$中)。接下来进行搜索,条件为当一个$\mathit{fathername}$未被使用时,如果首字母相同且按字典序,就记录下来,并将其标记为已使用。最后输出即可。

代码如下:

for(int i=1;i<=n;i++)
{
    la[a[i][0]]++;
    lb[b[i][0]]++;
}//带满足的首字母

for(int i=1;i<=n;i++)
{
    int tmp;
    for(int j=1;j<=n;j++)
        if(flag[j]==0&&
           (la[b[j][0]]<lb[b[j][0]]||a[i][0]==b[j][0])&&
           (lb[a[i][0]]<la[a[i][0]]||b[j][0]>=a[i][0]))
           {
               tmp=j;
               break;
           }//搜索
    same[i]=tmp;//记录配对
    flag[tmp]=1;//标记为已使用
    lb[b[tmp][0]]--;
    la[a[i][0]]--;//删除这一对
}

for(int i=1;i<=n;i++)
{
    cout<<a[i]<<" "<<b[same[i]];//配对输出
    if(i!=n)cout<<", ";
}//注意最后不能出现额外的空格或者逗号

std

#include<bits/stdc++.h>

using namespace std;

const int N=110;

int n;
string a[N],b[N];
int same[N],la[N],lb[N];
bool flag[N];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        cin>>a[i];//输入父亲的名字
    for(int i=1;i<=n;i++)
        cin>>b[i];//输入儿子的名字

    sort(a+1,a+n+1);
    sort(b+1,b+n+1);//快速排序
    
    for(int i=1;i<=n;i++)
    {
        la[a[i][0]]++;
        lb[b[i][0]]++;
    }//带满足的首字母
    
    for(int i=1;i<=n;i++)
    {
        int tmp;
        for(int j=1;j<=n;j++)
            if(flag[j]==0&&
               (la[b[j][0]]<lb[b[j][0]]||a[i][0]==b[j][0])&&
               (lb[a[i][0]]<la[a[i][0]]||b[j][0]>=a[i][0]))
               {
                   tmp=j;
                   break;
               }//搜索
        same[i]=tmp;//记录配对
        flag[tmp]=1;//标记为已使用
        lb[b[tmp][0]]--;
        la[a[i][0]]--;//删除这一对
    }
    
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" "<<b[same[i]];//配对输出
        if(i!=n)cout<<", ";
    }//注意最后不能出现额外的空格或者逗号
    return 0;
}

上一篇:mysql5.6初级使用方法学习第一天


下一篇:node=day5