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

无奈了,用归并做得为什么总是超时呢? 改掉COUT CIN 还不行啊。。。

Posted by zk54188 at 2007-11-06 17:03:40 on Problem 1002
#include<stdio.h>
#include<string.h>
#include<math.h>
const long map[ 26 ] = { 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0 };
const long MAX =  100000;
class Arrange {									// rearrange a array by alg : merge
public :
	Arrange( void );
	void Set_value( long , long, long );
	void Set_len( long );
	void Output( void );
	void Merge( long , long , long );
	void Merge_sort( long , long  );
private :
	long A[ MAX ];								// data
	long Num[ MAX ];							// the amount of data
	long len;
};
Arrange ::Arrange( void )
{
	long i;
	for ( i = 0; i < MAX; i ++ ) {
		A[ i ] = 100000000;
		Num[ MAX ] = 0;
	}
}
void Arrange ::Set_value( long a, long num, long i )
{
	A[ i ] = a;
	Num[ i ] = num;
}
void Arrange ::Set_len( long l )
{
	len = l;
}
void Arrange ::Output( )
{
	long i;
	for ( i = 1; i <= len; i ++ ) {
		printf( "%03ld-%04ld %ld\n", A[ i ] / 10000, A[ i ] % 10000 , Num[ i ] );
	}
}
void Arrange ::Merge( long p, long q, long r ) 
{
	long L[ MAX ];
	long L_num[ MAX ];
	long R[ MAX ];
	long R_num[ MAX ];
	long L_len;
	long R_len;
	long i;
	long j;
	long k;

	L_len = q - p + 1;
	R_len = r - q;
	for ( i = 1; i <= L_len; i ++ ) {
		L[ i ] = A[ p + i - 1 ];
		L_num[ i ] = Num[ p + i - 1 ];
	}
	for ( i = 1; i <= R_len; i ++ ) {
		R[ i ] = A[ q + i ];
		R_num[ i ] = Num[ q + i ];
	}
	L[ L_len + 1 ] = 100000000;
	R[ R_len + 1 ] = 100000000;
	i = j = 1;
	for ( k = p; k <= r; k ++ ) {
		if ( L[ i ] <= R[ j ] ) {
			A[ k ] = L[ i ];
			Num[ k ] = L_num[ i ];
			i ++;
		} else {
			A[ k ] = R[ j ];
			Num[ k ] = R_num[ j ];
			j ++;
		}
	}
}
void Arrange ::Merge_sort( long p, long r ) 
{
	long q ;
	if ( p < r ) {
		q = ( p + r ) / 2;
		Merge_sort( p , q );
		Merge_sort( q + 1, r );
		Merge( p, q , r );
	}
}
long main( void )
{
	Arrange Directory;
	long D_len;

	long List[ MAX ];
	long Count[ MAX ];
	long List_num;											
	long Input_len;											
	
	char Buffer[ 20 ];
	long Buffer_len;

	long sum;
	long by;
	
	bool insert;
	bool duplicate;
	
	long i;
	long l;

	scanf( "%ld", &Input_len );
	for ( l = 0; l < Input_len; l ++ ) {
		Count[ l ] = 0;
	}
	List_num = 0;
	
	// input all the data into List[ ..] & Count[ .. ]
	for ( l = 0; l < Input_len; l ++ ) {
		scanf( "%s", Buffer );
		Buffer_len = strlen( Buffer );
		sum = 0;
		by = 1000000;
		for ( i = 0; i < Buffer_len; i ++ ) {
			if ( Buffer[ i ] >= '0' && Buffer[ i ] <= '9' ) {
				sum += ( Buffer[ i ] - '0' ) * by;
				by /= 10;
			} else if ( Buffer[ i ] >= 'A' && Buffer[ i ] <= 'Z' ) {
				sum += map[ Buffer[ i ] - 'A' ] * by;
				by /= 10;
			} else {
				continue;
			}
		}
		insert = 1;
		for( i = 0; i < List_num; i ++ ) {
			if ( sum == List[ i ] ) {
				Count[ i ] ++;
				insert = 0;
			}
		}
		if ( insert ) {
			List[ List_num ] = sum;
			Count[ List_num ] ++;
			List_num ++;
		}
	}

	// put data into Directory
	duplicate = 0;
	for ( i = 0, D_len = 0; i <  List_num; i ++ ) {
		if ( Count[ i ] > 1 ) {
			duplicate = 1;
			D_len ++;
			Directory.Set_value( List[ i ], Count[ i ], D_len );
		}
	}
	Directory.Set_len( D_len );
	if ( duplicate ) { 
		Directory.Merge_sort( 1, D_len );
		Directory.Output( );
	} else {
		printf( "No duplicates.\n" );
	}

	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