洛谷P2141 珠心算测验的Java实现

题目来源

P2141 [NOIP2014 普及组] 珠心算测验

AC代码

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int count = 0;
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int []num = new int[n];
		for(int i = 0;i < n; i++) {
			num[i]=scan.nextInt();
		}
		for(int i = 0; i < n ; i++) {
			label:
			for(int j = 0; j < n ; j++) {
				if(j != i ) {
				for(int k = 0; k < n ; k++) {
					if(k != j && k != i) {
						//System.out.println("i:"+i+" j:"+j+" k:"+k);
						if(num[i] == num[j] + num[k]) {
							count++;
						    break label;
						    }
						}
					}
				}
			  }
			}
		System.out.println(count);
		scan.close();

	}
}

个人总结

  1. 第一点: 我认为这道题是最大的难点就是看懂题(极具迷惑性),题目要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?也就是说6 = 2+4与6 = 1+5 只记为一次。

  2. 第二点: 利用for循环和if判断才能遍历0-n-1个三位数的不同组合,比方说012,013,… ,102,103…;一开始我只用for循环的条件判断,即

		for(int i = 0; i < n ; i++) {
			for(int j = 0; j < n && j != i; j++) {
				for(int k = 0; k < n && k != i && k != j; k++) {
						System.out.println("i:"+i+" j:"+j+" k:"+k);
					}
				}
			}

敲黑板,以上的代码是错误的,因为一旦i=j,这个以i开头的数的组合不符合for循环条件就会被跳过了。

  1. 第三点: 在多层循环中,想直接从第三层循环直接跳到第一层循环,我采用了标记点break,这是一个比较冷门的知识点。

你可能感兴趣的:(#,刷题,算法,java)