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 }

时间: 2024-11-09 11:38:07

PAT A1054的相关文章

PAT 甲级 A1054 (2019/02/23)

1 #include<cstdio> 2 #include<map> 3 using namespace std; 4 int main(){ 5 int m, n, element; 6 scanf("%d %d", &m, &n); // 行数与列数 7 map<int, int> Count; // 数字与出现次数的map映射 8 for(int i = 0; i < m; i++){ 9 for(int j = 0; j

PAT 1009 说反话 C语言

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格. 输出格式:每个测试用例的输出占一行,输出倒序后的句子. 输入样例: Hello World Here I Come 输出样例: Come I Here World Hello 1 #include<stdio.h> 2 #

PAT 1006 换个格式输出 C语言

让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一行,用规定的格式输出n. 输入样例1: 234 输出样例1: BBSSS1

俺也晒晒pat代码!

最近在练习pat,很多题目不是很好做,一直找不到思路.通过google题目名称可以找到很多前辈的做题记录,这极大的方便了后来者.在此默默谢谢他们! 不过这同时也带了一些问题,有些前辈可能是急于出结果,所以使用了非常麻烦的方法把题目做出来了,有些后来者不经思考草草学习了就也这么做了...俺觉得这不应当是刷题所追求的目标,俺觉得既然练习旧的题目就应当追求超越前人,多想想有没有更巧妙,更简便的方法.否则科学技术也就停滞不前了... 不过俺又想了想或许很多“大牛”的确使用了简单的方法,只是他们没有时间或

pat 1068 动态规划/Fina More Conis

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special re

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1  就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打印就行了,但这题话说wrong好几次啊,坑点是沙漏符号后面不打印空格,orz... <span style="font-size:14px;">#include<iostream> #include<stdio.h> #include<math.h

1093. Count PAT&#39;s (25)

The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters. Now given any string, you are supposed to tell the numb

关于PAT和《构建之法》

这是官网的介绍——计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准.我觉得PAT的真正价值在于帮助那些学历或者专业不太好的人突破壁垒,也就是通过HR第一轮的刷简历,后面的流程还是需要自己有真才实学才可以啊.陈越姥姥致力于把PAT打造成IT业的托福,而事实上也确实如此,如今已初具规模,参加一次这样的考试,对我这种编程渣来说