AOJ2208 The Melancholy of Thomas Right

問題リンク The Melancholy of Thomas Right

  • 解法

列や行は入れ替えても構いません。よって、数字の並びをソートしても構わないことになります。
ここであることに気づきます。以下は行と列をソートした後のサンプル3です。

0 1 1 2 5 5 5 8 8 9
0
1 o
3 o o o
3 o o o
3 o o o
6 o o o o o o
6 o o o o o o
6 o o o o o o
7 o o o o o o o
9 o o o o o o o o o

行の下の段からoを埋めることを考えると、行の数字と、oを入れることができる列の個数が常に一致します。逆に、サンプル2の場合はこれが成り立ちません。
よってこのチェックをすることでYesかNoかが分かります。

  • ソース
import java.util.Arrays;
import java.util.Scanner;

//The Melancholy of Thomas Right
public class AOJ2208 {

	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			int n = sc.nextInt();
			if(n==0)break;
			int[] a = new int[n], b = new int[n];
			for(int i=0;i<n;i++)a[i]=sc.nextInt();
			for(int i=0;i<n;i++)b[i]=sc.nextInt();
			Arrays.sort(a);
			Arrays.sort(b);
			int t = 0, c = 0;
			while(t<n&&a[t]==0)t++;
			boolean f = true;
			for(int i=n-1;i>=0;i--){
				if(n-t!=b[i]){
					f = false; break;
				}
				c++;
				while(t<n&&a[t]<=c)t++;
			}
			System.out.println(f?"Yes":"No");
		}
	}
	
	public static void main(String[] args) {
		new AOJ2208().run();
	}
}