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 wcw at 2008-03-30 20:19:47 on Problem 1002
说说我通过的程序1002a.c的思路:
for ( n ){
  输入
  翻译(或者说转换)
}
排序;
统计输出;

原来我写的程序(1002b.c)思路是这样的:
for ( n ){
  输入
  翻译(或者说转换)
}
统计重复的号码;
删除重复的以及不用输出(个数小于2)的号码;
把剩下的号码排序;

我觉得1002b.c的想法应该比较好的,因为把不用输出(多余)的号码删除了,所以后面的排序会节省时间的。但是这种想法写出来的程序就是通不过。下面是我这两个程序的代码:

/* 1002a.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM_MAX_LEN	16

void translate(char *s, int *result){
	int length = strlen( s );
	int sindex;
	char c;
	*result = 0;
	for( sindex = 0; sindex < length; sindex++ ){
		c = s[sindex];
		if( c <= '9' && c >= '0'){
			*result = ( *result * 10 ) + c - '0';
		}
		else if( c >= 'A' && c <= 'R' ){
			*result = ( *result * 10 ) + ( c - 'A' ) / 3 + 2;
		}
		else if( c >= 'S' && c <= 'Y' ){
			*result = ( *result * 10 ) + ( c - 'A' - 1 ) / 3 + 2;
		}
		else if( c == '-' ){
			continue;
		}
		else{
			printf( "invalid char %c\n", c );
		}
	}
}

int cmp( const void *p, const void *q ){
	int *p1, *q1;
	p1 = ( int* )p;
	q1 = ( int* )q;
	return *p1 - *q1;
}

int 
main( ){
	int n = 0;
	int i, flag, x, count;
	int *result;
	char input[NUM_MAX_LEN];

	scanf( "%d", &n );
	result = ( int* )malloc( sizeof( int ) * n );

	for( i = 0; i < n; i++ ){
		scanf( "%s", input );
		translate( input, &( result[i] ) );
	}

	qsort( result, n, sizeof( int ), cmp );
	x = result[0];
	for( i = 1, flag = 0, count = 1; i < n; i++ ){
		if( result[i] == x ){
			count++;
		}
		else{
			if ( count > 1 ){
				flag = 1;
				printf( "%03d-%04d %d\n", x / 10000, x % 10000, count );
			}
			x = result[i];
			count = 1;
			
		}
	}
	if ( count > 1 ){
		flag = 1;
		printf( "%03d-%04d %d\n", x / 10000, x % 10000, count );
	}
	if( flag == 0 ){
		printf( "No duplicates.\n" );
	}
	return 0;
}


/* 1002b.c */
/*
 * 先除去重复的号码,再排序
 */ 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM_MAX_LEN	16


struct tel{
	int num;
	int count;
};

void translate(char *s, int *result){
	int length = strlen( s );
	int sindex;
	char c;
	*result = 0;
	for( sindex = 0; sindex < length; sindex++ ){
		c = s[sindex];
		if( c <= '9' && c >= '0'){
			*result = ( *result * 10 ) + c - '0';
		}
		else if( c >= 'A' && c <= 'R' ){
			*result = ( *result * 10 ) + ( c - 'A' ) / 3 + 2;
		}
		else if( c >= 'S' && c <= 'Y' ){
			*result = ( *result * 10 ) + ( c - 'A' - 1 ) / 3 + 2;
		}
		else if( c == '-' ){
			continue;
		}
		else{
			printf( "invalid char %c\n", c );
		}
	}
}


int cmp( const void *p, const void *q ){
	struct tel *p1 , *q1;
	p1 = ( struct tel *)p;
	q1 = ( struct tel *)q;
	return p1->num - q1->num;
}


int 
main( ){
	int n = 0;
	int i, j, count;
	struct tel *result;
	char input[NUM_MAX_LEN];

	scanf( "%d", &n );
	result = ( struct tel* )malloc( sizeof( struct tel ) * n );

	for( i = 0; i < n; i++ ){
		scanf( "%s", input );
		translate( input, &( result[i].num ) );
		result[i].count = 0;
	}
	/*
	 * get rid of the same string
	 */
	for( i = 0; i < n; i++){
		if( result[i].count == -1 ){
			continue;
		}
		result[i].count = 1;
		for( j = i + 1; j < n; j++){
			if( result[j].count != -1 && result[j].num == result[i].num ){
				result[i].count++;
				result[j].count = -1;
			}			
		}
	}
	count = 0;
	for( i = 0; i < n; i++ ){
		if( result[i].count > 1 ){
			result[count].num = result[i].num;
			result[count].count = result[i].count;
			count++;
		}
	}
	if( count == 0 ){
		printf( "No duplicates.\n");
		return 0;
	}
	if( count == 1 ){
		printf( "%03d-%04d %d\n", result[0].num / 10000, result[0].num % 10000, result[0].count );
		return 0;
	}
	/*
	 * arrange the string left
	 */
	qsort( result, count, sizeof( struct tel ), cmp );
	for( i = 0; i < count; i++ ){
		printf( "%03d-%04d %d\n", result[i].num / 10000, result[i].num % 10000, result[i].count );
	}

	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