PAT A1054
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT A1054相关的知识,希望对你有一定的参考价值。
题目看了之后觉得不难, 自己感觉考点应该是在复杂度上,应该很容易出现超时
第一次用哈希表提交后,果然有一个测试点超时
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int hashTable[16777217]={ 5 0 6 }; 7 int main() 8 { 9 10 int m,n,t; 11 12 cin>>m>>n; 13 for(int i=0;i<n;i++) 14 for(int j=0;j<m;j++) 15 { 16 cin>>t; 17 hashTable[t]++; 18 } 19 int mmax=0,num=-1; 20 for(int i=0;i<16777216;i++) 21 if(hashTable[i]>mmax) 22 { 23 mmax=hashTable[i]; 24 num=i; 25 } 26 cout<<num<<endl; 27 28 29 return 0; 30 }
经过分析后,发现其实最后那个for循环的遍历可以省去的,修改后如下
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int hashTable[16777217]={ 5 0 6 }; 7 int main() 8 { 9 10 int m,n,t; 11 int mmax=0,num=-1; 12 cin>>m>>n; 13 for(int i=0;i<n;i++) 14 for(int j=0;j<m;j++) 15 { 16 cin>>t; 17 hashTable[t]++; 18 if(hashTable[t]>mmax) 19 { 20 mmax=hashTable[i]; 21 num=t; 22 } 23 } 24 25 cout<<num<<endl; 26 27 28 return 0; 29 }
确实时间花费少多了,但是还是那个测试点超时,详细结果如下
经过分析算法本身的复杂度已经不能降低了,毕竟只要输入数据就会有结果。所以焦点放到程序的其它方面,比如输入输出
将程序的输入输出改为C语言模式后,所有测试点均通过
1 #include<stdio.h> 2 #include<algorithm> 3 4 int hashTable[16777217]={ 5 0 6 }; 7 int main() 8 { 9 10 int m,n,t; 11 int mmax=0,num=-1; 12 scanf("%d%d",&m,&n); 13 for(int i=0;i<n;i++) 14 for(int j=0;j<m;j++) 15 { 16 scanf("%d",&t); 17 hashTable[t]++; 18 if(hashTable[t]>mmax) 19 { 20 mmax=hashTable[i]; 21 num=t; 22 } 23 } 24 25 printf("%d\\n",num); 26 27 28 return 0; 29 }
以上是关于PAT A1054的主要内容,如果未能解决你的问题,请参考以下文章