我是靠谱客的博主 激情大地,最近开发中收集的这篇文章主要介绍PAT乙级 1073 多选题常见计分法 (20 分) Java 实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这题继承PAT1058,由PAT1058的代码改写而来。

我的主要核心思路是,把正确答案和学生写的答案读取出来,使用 charAt.(0) - 'a' 列为两个int数组。由于答案和选择的顺序一定是 a-b-c-d-e,所以可以直接使用 0-1-2-3-4的数组下标来表示。比较两个数组,两个数组都纯在某一选项时,把数据变为越界值 -1。 然后计算 非-1 的数量,表示选错或者未选到的选项,对其相应的

question[j].wrongTimes[realAns[k]]++;

最后比较所有的wrongTimes数值,进行输出。 

import java.io.*;
import java.util.Scanner;

public class pat1073 {
	
	static char[] chara = {'a', 'b', 'c', 'd', 'e'};

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StreamTokenizer st = new StreamTokenizer(br);
		st.wordChars('(', '(');
		st.wordChars(')', ')');
		st.nextToken();
		int N = (int)st.nval;
		st.nextToken();
		int M = (int)st.nval;
		Question1073[] question = new Question1073[M];
		for(int i=0;i<M;i++) {
			st.nextToken();
			int fullscore = (int)st.nval;
			st.nextToken();
			int selection = (int)st.nval;
			st.nextToken();
			int realSelec = (int)st.nval;
			int[] answers = new int[realSelec];		//用int记录数据更加轻量
			for(int j=0;j<realSelec;j++) {
				st.nextToken();
				answers[j] = st.sval.charAt(0) - 'a';	//0=a 1=b 2=c 3=d 4=e
			}
			question[i] = new Question1073(fullscore, realSelec, answers);			//只记录分数,答案数量,和答案
		}
		
		for(int i=0;i<N;i++) {
			double score = 0;
			for(int j=0;j<M;j++) {
				st.nextToken();
				int ansNum = st.sval.charAt(1) - '0';					//得到有多少个答案
				int[] ans = new int[ansNum];							//用来记录答案
				for(int k=0;k<ansNum;k++) {
					st.nextToken();
					ans[k] = st.sval.charAt(0) - 'a';					//记录答案为0 1 2 3 4
				}
				int[] realAns = new int[question[j].realSelec];			//用来记录正确答案,并复制数组
				for(int k=0;k<question[j].realSelec;k++) realAns[k] = question[j].answers[k];
				for(int k=0;k<ans.length;k++) {
					for(int l=0;l<realAns.length;l++) {
						if(ans[k]==realAns[l]) {						//如果选到了
							ans[k] = realAns[l] = -1;					//把两个数变成-1;
							break;										//节省时间
						}
					}
				}
				int remain1 = 0, remain2 = 0;							//记录两个数组中还有哪些选项没有变-1
				for(int k=0;k<ans.length;k++) if(ans[k]!=-1) {
					remain1++;
					question[j].wrongTimes[ans[k]]++;
				}for(int k=0;k<realAns.length;k++) if(realAns[k]!=-1) {
					remain2++;
					question[j].wrongTimes[realAns[k]]++;
				}
				int right = 0;											//判断对错
				if(remain1==0)	{										//如果学生答案全部被清除,则为半对
					right++;
					if(remain2==0)	right++;							//且正确答案全部清除,则全对
				}
				if(right==2) score += question[j].fullscore;			//如果对了,给学生加分
				if(right==1) score +=((double)question[j].fullscore)/2;	//加一半的分
			}
			System.out.println(score);									//输出学生分数
		}
		
		int max = 0;													//找到最难的题目的错误次数
		for(int i=0;i<M;i++) {
			for(int j=0;j<5;j++) {
				if(question[i].wrongTimes[j]>max) max = question[i].wrongTimes[j];
			}
		}
		
		if(max==0) System.out.print("Too simple");
		else {
			for(int i=0;i<M;i++) {
				for(int j=0;j<5;j++) {
					if(question[i].wrongTimes[j]==max) {
						System.out.println(max + " " + (i+1) + "-" + chara[j]);
					}
				}
			}
		}
		
	}

}

class Question1073 {
	
	int fullscore;
	int realSelec;
	int[] answers;
	int[] wrongTimes = new int[5];
	
	Question1073(int fullscore, int realSelec, int[] answers){
		this.fullscore = fullscore;
		this.realSelec = realSelec;
		this.answers = answers;
	}
	
}

最后

以上就是激情大地为你收集整理的PAT乙级 1073 多选题常见计分法 (20 分) Java 实现的全部内容,希望文章能够帮你解决PAT乙级 1073 多选题常见计分法 (20 分) Java 实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部