题目描述:
先附上刚开始自己写的代码(17分,最后一个测试点运行超时):
//1032
#include <stdio.h>
typedef struct player{
int num;
int score;
}P;
int main ( void )
{
int n, i, j, index;
scanf( "%d", &n );
P s[n];
int max_index = 1;
for( i = 0; i < n; i++ ){
int a, b;
scanf( "%d%d", &a, &b );
s[i].num = a;
s[i].score = b;
if( max_index < a )
max_index = a;
}
int max = 0;
for( i = 1; i <= max_index; i++ ){
int sum = 0;
for( j = 0; j < n; j++ )
if( i == s[j].num )
sum += s[j].score;
if( sum > max ){
max = sum;
index = i;
}
}
printf( "%d %d", index, max );
return 0;
}
仔细想了一下,最坏情况下如果所有参赛选手的学校都不同的话,这样的算法复杂度是O(n ^2),而且最坏情况下的输入规模是10的5次方,所以会导致运行超时。
修改后的代码:
//1032
#include <stdio.h>
int main ( void )
{
int n, i, max_index = 1;
scanf( "%d", &n );
int sum[100001] = {0};
for( i = 0; i < n; i++ ){
int a, b;
scanf( "%d%d", &a, &b );
if( a > max_index )
max_index = a;
sum[a] += b;
}
int max = 0, index;
for( i = 1; i <= max_index; i++ )
if( sum[i] > max ){
max = sum[i];
index = i;
}
printf( "%d %d", index, max );
return 0;
}
采取空间换时间的方法,用数组存放不同序号对应的分数和。