求助
  • 板块题目总版
  • 楼主Mx_sky
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/4/7 17:49
  • 上次更新2023/10/23 19:10:56
查看原帖
求助
713205
Mx_sky楼主2023/4/7 17:49

正在做练习......,某题的代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,A;
char x;
struct stu{
	string name;
	int num,tree,sub;
}a[100001];
bool cmp(stu a,stu b)
{
	return a.name<b.name;
}
map<char,int>l;
int main()
{
    std::ios::sync_with_stdio(0); 
    cin>>k>>n;
    for(int i=1;i<=k;i++)
        cin>>a[i].name;
    sort(a+1,a+1+k,cmp);
    for(int i=1;i<=k;i++)
    {
    	if(a[i].name[0]!=a[i-1].name[0])l[a[i].name[0]]=++A,a[A].tree=i,a[A].sub=a[A-1].tree+1;
    	else a[A].tree=i;
    }
    while(n--)
    {
    	cin>>x;
    	cout<<a[a[l[x]].sub].name<<endl;
		if(a[l[x]].sub==a[l[x]].tree)a[l[x]].sub=a[l[x]-1].tree+1;
    	else a[l[x]].sub++;
    }
    return 0;
}

题目描述

有K个学生,第i个学生的姓名是name[i],姓名是由长度不超过20个小写字母构成的,不存在姓名相同的学生。老师有N个礼物要分给学生。老师每次发一个礼物,每次只有一个学生能收到礼物,收到礼物的学生被称为本次得奖人,老师每次确定得奖人的过程是这样的: 1、老师给出一个小写字母,不妨假设该小写字母为 ‘a’。 2、姓名以‘a’开头的所有同学都是能拿到本次礼物的资格人选。 3、在资格人选当中,目前得到礼物数量最少的称为候选人。 4、如果候选人只有1人,那么该候选人就是本次得奖人;如果候选人多于1人,那么候选人当中,姓名字典序最小的那位候选人就是本次得奖人。 5、每次你的任务就是输出得奖人的姓名。

输入

第一行,两个整数,K和N。 接下来有K行,第i行是第i个学生的姓名name[i]。 接下来有N行,第i行是一个小写字母,表示老师发第个礼物时选取的字母。

输出

共N行,每行一个学生姓名,第i行对应老师发第i个礼物的得奖人姓名。

提示

【数据范围】 对于60%的数据,1 <= N, K <= 500。 对于100%的数据,1 <= K <= 100000, 1 <= N <= 100000。

原本时限是3s的,提交之后我的时间复杂度是600多ms,然后改成1s后,我就TLE了,为什么?

2023/4/7 17:49
加载中...