运行程序部分测试点超时,是不是双重for循环太多?(程序有注释)算法怎么改进?

vaying26760590 2017-07-22 09:02:50
“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数;随后N行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(<=10000),为参加派对的总人数;随后一行给出这M位客人的ID,以空格分隔。题目保证无人重婚或脚踩两条船。

输出格式:

首先第一行输出落单客人的总人数;随后第二行按ID递增顺序列出落单的客人。ID间用1个空格分隔,行的首尾不得有多余空格。

输入样例:
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
输出样例:
5
10000 23333 44444 55555 88888



#include<stdio.h>
void quicksort(int ac[],int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=ac[left];
if(left>right)
return;
while(i!=j)
{
while(ac[j]>=temp&&j>i)
j--;
if(j>i)
ac[i++]=ac[j];
while(ac[i]<=temp&&j>i)
i++;
if(j>i)
ac[j--]=ac[i];

}
ac[i]=temp;
quicksort(ac,left,i-1);
quicksort(ac,i+1,right);
}
int main()
{
int n,m,i,j,k,x,y,q=0,t,l;
int w;
int a[50000][2],b[10000]; //a数组存储伴侣编号,b数组存储参加的客人的编号
scanf("%d",&n);
for (i=0;i<n;i++){
for (j=0;j<2;j++){
scanf("%05d",&a[i][j]);
}
}
scanf("%d",&m);
w=m;
for (i=0;i<m;i++){
scanf("%d",&b[i]);
}
for (i=0;i<n;i++){ //一个双重for循环判断参加派对的客人中是否有情侣(将数组a一行一行地与数组b对
比)
x=a[i][0];
y=a[i][1];
l=0;
for (j=0;j<w;j++){
if(b[j]==x){ //如果找到一位有伴侣的客人
for (k=0;k<w;k++){ //则再一次循环寻找该客人的伴侣是否也出席
if(b[k]==y){ //如一对伴侣皆出席
m=m-2; //落单客人数-2
l=1;
b[j]=-1; //将一对伴侣皆设为-1 便于最后输出
b[k]=-1;
break;
}
}
}
if (l==1){
break;
}
}
}
printf("%d\n",m);
quicksort(b,0,w-1);
for(i=0;i<w-1;i++){
if(b[i]!=-1){
printf("%d ",b[i]);
}
}
if(b[w-1]!=-1){
printf("%05d",b[w-1]);
}
return 0;
}

我的程序是不是太繁杂了,不过算法应该是对的,5个测试点过了3个 ,最后两个超时!
请教一下怎么改进or简化?
...全文
242 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧