Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

各位,我是新手,请指教:用的堆排,为什么总是超时……该怎么改,难道非用快排不可么

Posted by lhyan792 at 2010-04-02 12:35:12 on Problem 1002
#include<stdio.h>
struct stat
{
	char s[10];
	long int num;
};
char a1[1000001][20];
char b1[1000001][10];
long int num1[1000001];
struct stat st1[1000001];
int exchange(struct stat *a,struct stat *b)   //交互
{
	struct stat c;
	c=*a;
	*a=*b;
	*b=c;
	return 0;
}
int mini(char *a,char *b)     //比较字符串大小的子函数
{
	long int i;
	long int j;
	for(i=0;i<=7;i++)
	{
		if(a[i]<b[i])
		{
			j=1;
			break;
		}
		else if(a[i]>b[i])
		{
			j=0;
			break;
		}
	}
	return j;
}
int sort(struct stat *a,struct stat *b,struct stat *c) //借助交换操作,进行三者排大小,k是用来区分情况的标志
{
	int k=0;
	if(mini(a->s,b->s)==0)
	{
		if(mini(b->s,c->s)==0)
		{
			exchange(a,c);
			k=3;
		}
		else
		{
			exchange(a,b);
			k=2;
		}
	}
	else if(mini(a->s,c->s)==0)
	{
		exchange(a,c);
		k=3;
	}
	else k=1;
	return k;
}	
int change(char *a,char *b)          //使字符串规范化XXX-XXXX
{
	long int i,j=0;
	for(i=0;i<=15;i++)              
	{
		if(a[i]=='\0')
			break;
		else if(a[i]<=57&&a[i]>=48)
		{
			if(j==3)
			{
				b[j]='-';
				i--;
			}
			else
				b[j]=a[i];
			j++;
		}
		else if(a[i]<=89&&a[i]>=65)
		{
			if(j==3)
			{
				b[j]='-';
				i--;
			}
			else
			{
				if(a[i]>80)
				a[i]=a[i]-1;
				b[j]=(a[i]-65)/3+50;
			}
			j++;
		}
		
	}
	return 0;
}
int judge(char *a,char *b)             //判断两个字符串是否相同
{
	long int i,j=0;
	for(i=0;i<=7;i++)
	{
		if(a[i]!=b[i])
		break;
	}
	if(i==8)
		return 1;
	else 
		return 0;
}
int sort_s(struct stat *st,int n)   //字符串排序
{
	long int i=1;
	int k=5;
	long int j;
	while(n>1)
	{
		for(i=n/2;i>=1;i--)
		{
			j=i;
			k=5;
			if((2*j+1)<=n)
			{
				while(k!=1&&(2*j<=n))
				{
					if(2*j+1<=n)
					{
						k=sort(&st[j],&st[2*j],&st[2*j+1]);
						j=(k/2+1)*j+k%2;
					}
					else
					{
						if(mini(st[j].s,st[2*j].s)==0)
						{
							exchange(&st[j],&st[2*j]);
							j=2*j;
						}
						k=1;
					}
				}
			}
			else
			{
				if(mini(st[j].s,st[2*j].s)==0)
				{
					exchange(&st[j],&st[2*j]);
					j=2*j;
				}
			}
		}
	printf("%s",st[1].s);
	printf(" %d\n",st[1].num);
		exchange(&st[1],&st[n]);
		n--;
	}
	printf("%s",st[1].s);
	printf(" %d\n",st[1].num);
	return 0;
}
int main()
{
	long int i=1,quan=0,k=0,j=1;         //i,j,k通用的变量,quan是控制输入号码个数的
	scanf("%d",&quan);
	while(j<=quan)                     //输入
	{
		scanf("%s",a1[j]);
		j++;
	}
	j=1;
	while(j<=quan)                      //规范化字符串
	{
		change(a1[j],b1[i]);
		for(k=1;k<i;k++)
		{
			if(judge(b1[k],b1[i])==1)
			{
				num1[k]++;
				break;
			}
		}
		if(k==i)
			{
			    num1[i]=1;
				i++;	
			}
		j++;
	}
	k=1;
	for(i=1;num1[i]!=0;i++)          //装配结构体,同时去除没有重复的号码
	{
		if(num1[i]!=1)
		{
			for(j=0;j<=7;j++)
			st1[k].s[j]=b1[i][j];
			st1[k].num=num1[i];
			k++;
		}
	}
	k--;                              //有重复的号码个数
	if(k==0)
		printf("No duplicates.\n");
	else
		sort_s(st1,k);                   //调用字符串排序子程序
	return 0;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator