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

使用排序做的 做了好多次终于 做出来了 C 写的 544k 360ms AC 体会好多。一点经验分享分享

Posted by chenjin1st at 2012-02-10 12:07:14 on Problem 1002 and last updated at 2012-02-28 12:30:26
本人是菜鸟。最开始的时候就纠结过一个星期在这里题目上。现在终于征服它了。写的不好地方个位高手见谅。
第1  这个题就一组数据 只是这组数据很大。
第2  我使用堆排序做的。推荐大家使用堆排序和归并排序 我测试过排序十万个数据这两种排序时间用的最短。0.043S 就跑完了。冒泡啥的要41S 
第3 .输入数据长度可能足够长,因为可以有多个‘-’ 我开到240才能行。
第4  推荐大家使用malloc这个函数 可以节省不必要的空间开销。
我的思路就是输入数据后然后把这些数据排序好了后。再扫描一次需要的数据输出
代码部分
写的很丑陋  惭愧。
#include<stdlib.h>
#include<stdio.h>
int tidy_phonenumber(char telphone[],int *number); /*字符串处理部分*/
int HeapAdjust(int mid[],int start,int n);        /*构造堆排序的函数*/
int HeapSort(int mid[],int n);					/*堆排序函数*/
int main(){
	int n,i,j,k,flag=1,*mid;
	char phone[250];
	scanf("%d",&n);
	mid=(int *)malloc(n*sizeof(int));        /*动态申请空间避免空间浪费*/
	for(i=0;i<n;i++){
		scanf("%s",phone);
		tidy_phonenumber(phone,&mid[i]);
	}
	HeapSort(mid,n);                       /*排序部分*/
	/*下面的对已经排序的好的数组进行扫描输出我们需要的*/
	/*扫描部分自我感觉还可以优化*/
	for(i=0;i<n;){
		if(mid[i]==mid[i+1]){
			for(j=i,k=1;mid[j]==mid[j+1];){
				j++;
				k++;
			}
			printf("%03d-%04d %d\n",mid[i]/10000,mid[i]%10000,k);
			i+=k;
			flag=0;
		}else{
			i++;
		}
	}
	if(flag)	/*如果没有相同的情况下输出。我想也不可能没有相同*/
		printf("No duplicates.\n");
	free(mid);/*释放空间*/
	return 0;
}
int tidy_phonenumber(char telphone[],int *number){
	char ch;
	int j,i,k;
	k=i=0;
	while(telphone[i]){
		   ch=telphone[i];
		   if(ch>='0'&&ch<='9'){
				k=k*10+(ch-'0');
		   }else{
			   if(ch>='A'&&ch<='P'){
					j=(ch-'A')/3+2;	
					k=k*10+j;
				}else{
					if(ch>='R'&&ch<='Y'){
						j=(ch-'A'-1)/3+2;
						k=j+k*10;
					}
			    }
		   }
		   i++;
	}
	*number=k;
	return 0;
}
int HeapSort(int mid[],int n){
	int i,j,value;
	for(i=n/2-1;i>=0;i--){
		HeapAdjust(mid,i,n);
	}
	for(i=n-1;i>0;i--){
		value=mid[0];
		mid[0]=mid[i];
		mid[i]=value;
		HeapAdjust(mid,0,i);
	}
	return 0;
}
int HeapAdjust(int mid[],int start,int n){
	int i,j;
	while(2*start+1<n){
		j=2*start+1;
		if((j+1)<n){
			if(mid[j]<mid[j+1])
				j++;
		}
		if(mid[start]<mid[j]){
			i=mid[start];
			mid[start]=mid[j];
			mid[j]=i;
			start=j;
		}else{
			break;
		}
	}
	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