PAT乙级试题整理(二)——牛客网20分真题整理

牛客网上 共有真题六套,其中每套题有15分题一道,20分题目3道,25分题目1道,共计100分。考试时要求考生在180分钟内完成,依照陈越姥姥的说法,要在30分钟内拿下乙级20分题目,所以我们这篇主要想办法怎么尽量缩短自己的做题时间。我之前只学过Java和C#,没有学过C语言,粗浅学习了一下C语言基本语法,想借刷题这个机会好好体会一下面向过程的设计语言的精髓,因此在第一部分用了C语言做,做完之后发现。。。我还是用Java吧。依照前面的计划: 1.先说题目思路,2.再贴上自己的垃圾代码,做一番自我批评,3.然后贴上我认为的经典代码,分析一番以便学习。通过这样的三个步骤希望提高自己的水平,也为后面开始做25分题做准备。

先说方法

				  ——读题后列出伪代码

很多情况下,我们读题之后就想打开vc直接上手做题,面对比较简单的题目,这样的做法也无可厚非;但作为一个刚刚接触算法题,并且是一个非本专业的新手,养成一个良好的做算法题的习惯就显得尤为重要。这里我随便用一道题目,来分享一下我写伪代码的心路历程。
牛客网 乙级真题1022 挖掘机技术哪家强

这里为了方便我就截图了
这里写图片描述
这里写图片描述
拿到题目感觉简单不要着急,将我们的伪代码分成三部分,按照 输入->处理->输出 的步骤进行分解:
输入阶段:学生总个数n;学校既要编号又要分数,我们考虑建立一维数组school[],学校编号是数组序号;考生不多说二维数组stu[n][2],我们就按照这个进行输入;
处理阶段:遍历考生数组,给school[stu[i][0]] + stu[i][1],循环完毕即可;
输出阶段:比较找出school数组最大值,输出其编号及其最大值。
代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
	//输入
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[][] input = new int[n][2];
		int[] school = new int[1000000];
		for(int i = 0; i< n; i++) {
			input[i][0] = in.nextInt();
			input[i][1] = in.nextInt();
		}
	//处理
		for(int i = 0; i< n; i++) {
			school[input[i][0]] += input[i][1];
		}
	//输出
		int max = school[0];
		int maxNum = 0;
		for(int i = 0; i < school.length; i++) {
			if(school[i] > max) {
				max = school[i];
				maxNum = i;
			}
		}
		System.out.println(maxNum+" "+max);
	}
}

也就这么几行代码,简介清楚,下面给出别人用C写的代码,很简短,可参考:

#include<stdio.h>
int main() {
    int i,sno,sco,k = 0,N;
    scanf("%d",&N);
    int scores[100050];
    for(i = 0; i < 100050; i ++) scores[i] = 0;
    for(i = 0; i < N; i ++) {
        scanf("%d %d",&sno,&sco);
        scores[sno] += sco;
        if(scores[sno] >= scores[k]) k = sno;
    }
    printf("%d %d\n",k,scores[k]);
    return 0;
}

需要补充的是,上面的代码用的是输入处理二合一的方法,当然也可行,对内存有点影响不过对于运行时间差别并不会很大,而且可能会造成思路上的混乱。同样的,还可以有处理和输出二合一的方法,虽然不适用于本题目,但还适用于其他大部分题目,当然,一样不建议初学者使用。总的来说,初学者用这三步可以简洁明了完成题目,而且这个方法对于乙级题目绰绰有余,精准快速易于调试。不过对于面向甲级顶级的考生,可能我这套早就过时了。。。我也是今天报考了秋季甲级,希望在接下来的一周内巩固好乙级基础知识,为甲级算法打好基础。

未完待续。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值