import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws IOException
	{
		Scanner sc = new Scanner(System.in);

		int [] list = new int[10];
		int i,j;

		for(i=0;i<10;i++){
			list[i] = sc.nextInt();
		}
		Arrays.sort(list);

		for(j=0;j<3;j++){
			System.out.println(list[9-j]);
		}
	}

}

Global OOD problem IDs are disjoint from train, validation, and in-distribution test problem IDs.

List of Top 3 Hills

There is a data which provides heights (in meter) of mountains. The data is only for ten mountains.

Write a program which prints heights of the top three mountains in descending order.

Input

Height of mountain 1
Height of mountain 2
Height of mountain 3
.
.
Height of mountain 10

Constraints

0 ≤ height of mountain (integer) ≤ 10,000

Output

Height of the 1st mountain
Height of the 2nd mountain
Height of the 3rd mountain

Sample Input 1

1819
2003
876
2840
1723
1673
3776
2848
1592
922

Output for the Sample Input 1

3776
2848
2840

Sample Input 2

100
200
300
400
500
600
700
800
900
900

Output for the Sample Input 2

900
900
800

Submitted source-code file size, in bytes.

Execution CPU time reported by official Project CodeNet metadata, in milliseconds.

Peak memory usage reported by official Project CodeNet metadata, in kilobytes.


import java.util.Scanner;

class Main {
    private static void solve() {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            System.out.println(String.valueOf(a + b).length());
        }
    }

    public static void main(String... args) {
        solve();
    }
}

Digit Number

Write a program which computes the digit number of sum of two integers a and b.

Input

There are several test cases. Each test case consists of two non-negative integers a and b which are separeted by a space in a line. The input terminates with EOF.

Constraints

0 ≤ a, b ≤ 1,000,000

The number of datasets ≤ 200

Output

Print the number of digits of a + b for each data set.

Sample Input

5 7
1 99
1000 999

Output for the Sample Input

2
3
4


import java.io.*;

public class Main{
	static int digit(int a, int b){
		int x = a + b;
		int d = 0;
		while( x > 0 ){
			d++;
			x /= 10;
		}
		return d;
	}

	public static void main(String[] args) throws IOException {
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
		final int NUM = 1000;
		String[] str = new String[NUM];
		String[][] s = new String[NUM][2];
		int[][] p = new int[NUM][2];
		int i = 0;

		while( (str[i] = stdIn.readLine()) != null ){
			str[i] = stdIn.readLine();
			s[i] = str[i].split(" ");
			p[i][0] = Integer.parseInt(s[i][0]);
			p[i][1] = Integer.parseInt(s[i][1]);
			i++;
		}

		for(int j = 0; j < i; j++){
			System.out.println(digit(p[j][0],p[j][1]));
		}
	}
}


import java.io.*;

class Main{
	public static void Triangle(int[] data){
		int a,b,c,d;
		a=(int)Math.pow(data[0],2);
		b=(int)Math.pow(data[1],2);
		c=(int)Math.pow(data[2],2);
		d=(int)Math.sqrt(a+b);
		if(d==data[2]){
			System.out.println("YES");
		}
		else if((d=(int)Math.sqrt(a+c))==data[1]){
			System.out.println("YES");
		}
		else if((d=(int)Math.sqrt(b+c))==data[0]){
			System.out.println("YES");
		}
		else{
			System.out.println("NO");
		}
	}

	public static void main(String[] args) throws IOException{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		String str[]=new String[3];
		int N,i;
		int Line[]=new int[3];
		i=1;
		N=Integer.parseInt(in.readLine());
		while(i<=N){
			str=(in.readLine()).split(" ",0);
			for(int j=0;j<=2;j++){
				Line[j]=Integer.parseInt(str[j]);
			}
			Triangle(Line);
			i++;
		}
	}
}

Is it a Right Triangle?

Write a program which judges wheather given length of three side form a right triangle. Print "YES" if the given sides (integers) form a right triangle, "NO" if not so.

Input

Input consists of several data sets. In the first line, the number of data set, N is given. Then, N lines follow, each line corresponds to a data set. A data set consists of three integers separated by a single space.

Constraints

1 ≤ length of the side ≤ 1,000

N ≤ 1,000

Output

For each data set, print "YES" or "NO".

Sample Input

3
4 3 5
4 3 6
8 8 8

Output for the Sample Input

YES
NO
NO


import java.util.*;

class Main{
    public static void main(String[] args){
	Scanner s = new Scanner(System.in);
	int k,a,b,c;

	k = s.nextInt();

	for(int i=0;i<k;i++){
	    a=s.nextInt();
	    b=s.nextInt();
	    c=s.nextInt();

	    if(b>a&&b>c){
		int swap = b;
		b=c;
		c=swap;
	    }else if(a>b&&a>c){
		int swap = a;
		a=c;
		c=swap;
	    }

	    if((c*c)==(a*a+b*b)){
		System.out.println("YES");
	    }
	    else{
		System.out.println("NO");
	    }

	}
    }
}


import java.util.Scanner;

class Main{
    public static void main(String[] args){
        double EPS = 1e-6;
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            double a = in.nextDouble();
            double b = in.nextDouble();
            double c = in.nextDouble();
            double d = in.nextDouble();
            double e = in.nextDouble();
            double f = in.nextDouble();
            double x = (e * c - b * f) / (a * e - b * d);
            double y = (- c * d + a * f) / (a * e - b * d);
            System.out.printf("%.3f %.3f\n", x+EPS, y+EPS);
        }
    }
}

Simultaneous Equation

Write a program which solve a simultaneous equation:

ax + by = c

dx + ey = f

The program should print x and y for given a, b, c, d, e and f (-1,000 ≤ a, b, c, d, e, f ≤ 1,000). You can suppose that given equation has a unique solution.

Input

The input consists of several data sets, 1 line for each data set. In a data set, there will be a, b, c, d, e, f separated by a single space. The input terminates with EOF.

Output

For each data set, print x and y separated by a single space. Print the solution to three places of decimals. Round off the solution to three decimal places.

Sample Input 1

1 2 3 4 5 6
2 -1 -2 -1 -1 -5

Output for the Sample Input 1

-1.000 2.000
1.000 4.000

Sample Input 2

2 -1 -3 1 -1 -3
2 -1 -3 -9 9 27

Output for the Sample Input 2

0.000 3.000
0.000 3.000


import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.lang.Math;

class Main{
    public static void main(String[] args){
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(inputStreamReader);
        boolean firstTime = true;

        String str;
        double[] num;
        double[] xy;
        try {
            while(reader.ready()){
                str = reader.readLine();
                num = getNum(str);
                xy = solveXY(num);
                //System.out.println(xy[0] + " " + xy[1]);
                System.out.println(String.format("%.3f %.3f", xy[0], xy[1]));
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static double[] getNum(String str){
        String[] data = str.split(" ");
        double[] num = new double[data.length];

        for (int i = 0; i < data.length; i++){
            num[i] = Double.parseDouble(data[i]);
        }
        return num;
    }

    private static double[] solveXY(double num[]){
        // ax+by=c
        // dx+ey=f

        // x = (bf - ce) / (ae - bd)
        // y = (c - ax) / b = (f - dx) / e

        double[] xy = new double[2];
        double a, b, c, d, e, f;

        a = num[0];
        b = num[1];
        c = num[2];
        d = num[3];
        e = num[4];
        f = num[5];

        xy[0] = ((c * e) - (b * f)) / ((a * e) - (b * d));
        xy[1] = (c - a * xy[0]) / b;

        xy[0] = Math.round(xy[0] * 1000) * 0.001;
        xy[1] = Math.round(xy[1] * 1000) * 0.001;

        return xy;
    }
}


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner stdin = new Scanner(System.in);
		int a = 0;
		int b = 0;
		int ab = 0;
		int r = 0;
		int gcd = 0;
		int lcm = 0;
		int temp = 0;
		while(stdin.hasNext()) {
			a = stdin.nextInt();
			b = stdin.nextInt();
			ab = a * b;

			if(a < b) {
				temp = a;
				a = b;
				b = temp;
			}
			if(a >= b) {
				do {
					r = a % b;
					if(r == 0) {
						break;
					} else {
						a = b;
						b = r;
					}
				}while(r != 1);
				gcd = b;
				lcm = ab / b;
				System.out.println(gcd + " " + lcm);

			}
		}
	}
}

GCD and LCM

Write a program which computes the greatest common divisor (GCD) and the least common multiple (LCM) of given a and b.

Input

Input consists of several data sets. Each data set contains a and b separated by a single space in a line. The input terminates with EOF.

Constraints

0 < a, b ≤ 2,000,000,000

LCM(a, b) ≤ 2,000,000,000

The number of data sets ≤ 50

Output

For each data set, print GCD and LCM separated by a single space in a line.

Sample Input

8 6
50000000 30000000

Output for the Sample Input

2 24
10000000 150000000


import java.io.*;

class Main{
    public static void main(String[] args) throws Exception{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        double x = Double.parseDouble(br.readLine());
        double y = 100000;
        long    z = 0;
        for (long i=0; i<x; i++) {
            y = y + (y * 1.05);
            y = y /1000;
            y = Math.ceil(y);
            y = y * 1000;
            z = (long)y;
        }
        System.out.println(z);
    }
}

Debt Hell

Your friend who lives in undisclosed country is involved in debt. He is borrowing 100,000-yen from a loan shark. The loan shark adds 5% interest of the debt and rounds it to the nearest 1,000 above week by week.

Write a program which computes the amount of the debt in n weeks.

Input

An integer n (0 ≤ n ≤ 100) is given in a line.

Output

Print the amout of the debt in a line.

Sample Input

5

Output for the Sample Input

130000


import java.util.*;

public class Main{

	public static void main(String[] args) {
		Scanner scanf =new Scanner (System.in);

		int n=scanf.nextInt() , i,S=100000;

		for (i=0;i<n;i++)
		{S*=1.05;
		if(S%1000!=0) S=S+1000-S%1000; }
		System.out.println(S);

	}
}


import java.util.Scanner;
class Main{
    public static void main(String[] a){

    	Scanner scan = new Scanner(System.in);
    	while (scan.hasNext()){
    	int n = 0;
    	int count = 0;
    	n = scan.nextInt();

    	for(int i = 0; i < 10;i++){
    		for(int k = 0; k < 10; k++){
    			for(int y = 0; y < 10; y++){
    				for(int j = 0; j < 10; j++){

    					if(i+k+y+j == n){
    						count += 1;
    					}
    				}
    			}
    		}
    	}
    	System.out.println(count);
    	}
 }
}

Sum of 4 Integers

Write a program which reads an integer n and identifies the number of combinations of a, b, c and d (0 ≤ a, b, c, d ≤ 9) which meet the following equality:

a + b + c + d = n

For example, for n = 35, we have 4 different combinations of (a, b, c, d): (8, 9, 9, 9), (9, 8, 9, 9), (9, 9, 8, 9), and (9, 9, 9, 8).

Input

The input consists of several datasets. Each dataset consists of n (1 ≤ n ≤ 50) in a line. The number of datasets is less than or equal to 50.

Output

Print the number of combination in a line.

Sample Input

35
1

Output for the Sample Input

4
4


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String uketori=br.readLine();
		int sum=Integer.parseInt(uketori);
		long kazu = 0;
		if(sum>=27 && sum<=36){
			int aki=36-sum;
			kazu=((aki+3)*(aki+2)*(aki+1))/6;
		}
		else if(sum>=10 && sum<=18){
			int aki=sum;
			kazu=((aki+3)*(aki+2)*(aki+1))/6;
			int gen=0;
			for(int a=sum-9; a>=0; a--){
				gen+=(a+1)*a*2;
			}
			kazu=kazu-gen;

		}
		else if(sum>=19 && sum<=26){
			int aki=36-sum;
			kazu=((aki+3)*(aki+2)*(aki+1))/6;
			int gen=0;
			for(int a=aki-9; a>=0; a--){
				gen+=(a+1)*a*2;
			}
			kazu=kazu-gen;
		}
		else if(sum>=0 && sum<=9){
			int aki=sum;
			kazu=((aki+3)*(aki+2)*(aki+1))/6;
		}
		System.out.println(kazu);
	}
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bufReader =
				new BufferedReader(new InputStreamReader(System.in));
		while (true) {
			String read = bufReader.readLine();
			if (read == null) {
				break;
			}
			int n = Integer.parseInt(read);
			int match = 0;
			for (int i = 0; i < 10; i++) {
				for (int j = 0; j < 10; j++) {
					for (int k = 0; k < 10; k++) {
						for (int l = 0; l < 10; l++) {
							if (i + j + k + l == n) {
								++match;
							}
						}
					}
				}
			}
			System.out.println(match);
		}
	}

}


import java.util.*;

class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int num=0;
while(sc.hasNextInt()){
int n=sc.nextInt();
boolean[] prime=new boolean[n];
if(n>2){
for(int i=2;i<n;i++){
prime[i]=true;
}
for(int i=2;i<n;i++){
if(prime[i]){
num++;
for(int j=2*i;j<n;j+=i){
prime[j]=false;
}
}
}
}
else{
num=n-1;
}
System.out.println(num);
}
}
}

Prime Number

Write a program which reads an integer n and prints the number of prime numbers which are less than or equal to n. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. For example, the first four prime numbers are: 2, 3, 5 and 7.

Input

Input consists of several datasets. Each dataset has an integer n (1 ≤ n ≤ 999,999) in a line.

The number of datasets is less than or equal to 30.

Output

For each dataset, prints the number of prime numbers.

Sample Input

10
3
11

Output for the Sample Input

4
2
5


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Main{
	public static void main(String[] a){
		Scanner scanner = new Scanner(System.in);
		List<Integer> list = new ArrayList<Integer>();
		Integer input;

		try {
			int countInput = 0;
			while (scanner.hasNextInt()){
            	if (countInput >= 30) {break;}
                input = scanner.nextInt();

                if (input > 0 && input < 999999) {
                	list.add(input);
                }
                countInput++;
            }
		}catch (Exception e) {
        	System.err.println("wrong format");

        } finally {
            scanner.close();
        }

		int prime,num,div;
		for (Integer inputList : list) {
			num = inputList.intValue();
			prime = 1;
			for (int i = 3; i <= num; i+=2) {
				div = 0;
				for (int j = 2; j < i; j++) {
					if (j > 11) {break;}
					if (i % j == 0) {
						div++;
						break;
					}
				}
				if (div == 0) {
					prime++;
				}
			}

			System.out.println(prime);
		}

	}
}


import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int p = sc.nextInt();
			int so=1;
			for(int i=2; i<=p; i++){
				int han =0;
				for(int j=2; j<=i-1; j++){
					if(i%j == 0){
						han = 1;
						break;
					}
				}
				if(han != 1){
					so++;
				}
			}
			System.out.println(so-1);
		}
	}
}


import java.util.Scanner;
public class Main {
	public static void main(String args[]){
		int t=0,i,j,count=0;
		int lim;
		int[] x = new int[30];
		Scanner scan = new Scanner(System.in);

		while(scan.hasNextInt()){
			lim = scan.nextInt();
			count = 0;
			if(lim >= 2)count++;

			for(i=3;i<=lim;i=i+2){
				for(j=3;j<=lim;j = j+2){
					int k = i % j;
					if(j == i){
						count++;
					}
					if(k == 0)break;
				}
			}
		System.out.println(count);
			x[t] = count;
			t++;
		}

		for(int s : x){
			System.out.println(s);
		}
	}
}


import java.util.Scanner;

public class Main {
	public static void main (String[] args) {
		Scanner sc = new Scanner(System.in);
		int w = sc.nextInt();
		int n = sc.nextInt();
		int[] num = new int[w];
		for(int i = 0; i < w; i++) {
			num[i] = i + 1;
		}
		for (int i = 0; i < n; i++) {
			String str = sc.next();
			String[] ab = str.split(",");
			int a = Integer.parseInt(ab[0]) -1;
			int b = Integer.parseInt(ab[1]) -1;
			// swap
			int tmp = num[a];
			num[a] = num[b];
			num[b] = tmp;
		}
		for(int i = 0; i < w; i++) {
			System.out.println(num[i]);
		}
	}
}

Drawing Lots

Let's play Amidakuji.

In the following example, there are five vertical lines and four horizontal lines. The horizontal lines can intersect (jump across) the vertical lines.

In the starting points (top of the figure), numbers are assigned to vertical lines in ascending order from left to right. At the first step, 2 and 4 are swaped by the first horizontal line which connects second and fourth vertical lines (we call this operation (2, 4)). Likewise, we perform (3, 5), (1, 2) and (3, 4), then obtain "4 1 2 5 3" in the bottom.

Your task is to write a program which reads the number of vertical lines w and configurations of horizontal lines and prints the final state of the Amidakuji. In the starting pints, numbers 1, 2, 3, ..., w are assigne to the vertical lines from left to right.

Input

w
n
a1,b1
a2,b2
.
.
an,bn

w (w ≤ 30) is the number of vertical lines. n (n ≤ 30) is the number of horizontal lines. A pair of two integers ai and bi delimited by a comma represents the i-th horizontal line.

Output

The number which should be under the 1st (leftmost) vertical line

The number which should be under the 2nd vertical line

:

The number which should be under the w-th vertical line

Sample Input

5
4
2,4
3,5
1,2
3,4

Output for the Sample Input

4
1
2
5
3


import java.util.Scanner;

public class Main {
	private Scanner sc;

	public static void main(String[] args) {
		new Main();
	}

	public Main() {
		sc = new Scanner(System.in);

		while (sc.hasNext() == true) {
			int d = Integer.parseInt(sc.next());

			int sum = 0;
			for (int i = d; i < 600; i = i + d) {
				sum = sum + (int)Math.pow(i, 2) * d;
			}
			System.out.println(sum);
		}
	}
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Integral

Write a program which computes the area of a shape represented by the following three lines:

$y = x^2$

$y = 0$

$x = 600$

It is clear that the area is $72000000$, if you use an integral you learn in high school. On the other hand, we can obtain an approximative area of the shape by adding up areas of many rectangles in the shape as shown in the following figure:

$f(x) = x^2$

The approximative area $s$ where the width of the rectangles is $d$ is:

area of rectangle where its width is $d$ and height is $f(d)$ $+$

area of rectangle where its width is $d$ and height is $f(2d)$ $+$

area of rectangle where its width is $d$ and height is $f(3d)$ $+$

...

area of rectangle where its width is $d$ and height is $f(600 - d)$

The more we decrease $d$, the higer-precision value which is close to $72000000$ we could obtain. Your program should read the integer $d$ which is a divisor of $600$, and print the area $s$.

Input

The input consists of several datasets. Each dataset consists of an integer $d$ in a line. The number of datasets is less than or equal to 20.

Output

For each dataset, print the area $s$ in a line.

Sample Input

20
10

Output for the Sample Input

68440000
70210000


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO ?????????????????????????????????????????????
		Scanner sc = new Scanner(System.in);

		while (sc.hasNext()) {
			int d = sc.nextInt();
			System.out.println(integ(d));
		}
	}

	public static long integ(int d) {
		int x = d;
		long ans = 0;
		do {
			ans += x*x * d;
			x = x + d;
		} while (x != 600);
		return ans;
	}
}


import java.io.*;

public class Main{
	public static void main(String[] args) throws IOException{
		try{
	        InputStreamReader isr = new InputStreamReader(System.in);
	        BufferedReader br = new BufferedReader(isr);
	        String str;
	        String target[];
	        int  checkResult = 99;
	        int caesar;

	        while( (str = br.readLine()) != null){
	        	caesar = 0;
	        	target =  str.split(" ");
		        for(int i = 0; i < target.length; i++){
	        		checkResult = checkPattern(target[i]);
	        		if(checkResult != 99){
	        			caesar = checkResult;
	        			break;
	        		}
	        	}

	            StringBuilder result = new StringBuilder();
	            for(int i = 0; i < target.length; i++){
	        	    result.append(makeCaeserString(target[i],caesar));
	        	    result.append(" ");
	            }
	            System.out.println(result);
	        }
		}catch(Exception e){
			System.out.println(e);
		}
	}

	private static int checkPattern(String str){

		String target[];
		target = str.split("\\.");
		int result  = 99;

		for(int i = 0; i < target.length; i++){
			result = isThe(target[i]);
			if(result != 99) break;
			result = isThis(target[i]);
			if(result != 99) break;
			result = isThat(target[i]);
			if(result != 99) break;
		}
		return result;
	}

	private static int isThe(String str){

		String newStr;
		String  target = "the";
		int result = 99;

		if(str.length() != target.length()) return result;

		for(int i = -26; i < 27; i++){
			//str.charAt(j)???str???j????????????????????????
			newStr =  String.valueOf((char)(str.charAt(0)+i))
					 + String.valueOf((char)(str.charAt(1)+i))
				     + String.valueOf((char)(str.charAt(2)+i));

			if( newStr.equals(target) ){
				result = i;
				break;
			}
		}
		return result;
	}

	private static int isThis(String str){

		String newStr;
		String  target = "this";
		int result = 99;

		if(str.length() != target.length()) return result;

		for(int i = -26; i < 27; i++){
			//str.charAt(j)???str???j????????????????????????
			newStr =  String.valueOf((char)(str.charAt(0)+i))
					 + String.valueOf((char)(str.charAt(1)+i))
				     + String.valueOf((char)(str.charAt(2)+i))
			         + String.valueOf((char)(str.charAt(3)+i));

			if( newStr.equals(target) ){
				result = i;
				break;
			}
		}
		return result;
	}
  private static int isThat(String str){

	String newStr;
	String  target = "that";
	int result = 99;

	if(str.length() != target.length()) return result;

	for(int i = -26; i < 27; i++){
		//str.charAt(j)???str???j????????????????????????
		newStr =  String.valueOf((char)(str.charAt(0)+i))
				 + String.valueOf((char)(str.charAt(1)+i))
			     + String.valueOf((char)(str.charAt(2)+i))
			     + String.valueOf((char)(str.charAt(3)+i));

		if( newStr.equals(target) ){
			result = i;
			break;
		}
	}
	return result;
  }

  private static String makeCaeserString(String str,int n){

	  int intA = 'a';
	  int intZ = 'z';
	  int zure = 0;
	  String result = "";

	  for(int i = 0; i < str.length(); i++){
		  if(str.charAt(i)<intA || str.charAt(i) > intZ){
			  return str;
		  }else if( (str.charAt(i)) == ".".charAt(0)){
			  zure = -n;
		  }else if( str.charAt(i) + n < intA ){
			  zure = 26;
		  }else if(str.charAt(i) + n > intZ){
			  zure = -26;
		  }
		  result += String.valueOf((char)(str.charAt(i)+n+zure));
	      zure = 0;
	  }
	  return result;
  }
}

Caesar Cipher

In cryptography, Caesar cipher is one of the simplest and most widely known encryption method. Caesar cipher is a type of substitution cipher in which each letter in the text is replaced by a letter some fixed number of positions down the alphabet. For example, with a shift of 1, 'a' would be replaced by 'b', 'b' would become 'c', 'y' would become 'z', 'z' would become 'a', and so on. In that case, a text:

this is a pen

is would become:

uijt jt b qfo

Write a program which reads a text encrypted by Caesar Chipher and prints the corresponding decoded text. The number of shift is secret and it depends on datasets, but you can assume that the decoded text includes any of the following words: "the", "this", or "that".

Input

Input consists of several datasets. Each dataset consists of texts in a line. Input ends with EOF. The text consists of lower-case letters, periods, space, and end-of-lines. Only the letters have been encrypted. A line consists of at most 80 characters.

You may assume that you can create one decoded text which includes any of "the", "this", or "that" from the given input text.

The number of datasets is less than or equal to 20.

Output

Print decoded texts in a line.

Sample Input

xlmw mw xli tmgxyvi xlex m xsso mr xli xvmt.

Output for the Sample Input

this is the picture that i took in the trip.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

		String[] 	arrNbrLstStr = bufferedReader.readLine().split(" ");
		int[] 		arrNbrLst = new int[arrNbrLstStr.length];

		for(int i = 0; i < arrNbrLst.length; i++) arrNbrLst[i] = Integer.parseInt(arrNbrLstStr[i]);

		for(int i = 0; i < arrNbrLst.length - 1; i++) {
			for(int j = i + 1; j < arrNbrLst.length; j++) {
				if(arrNbrLst[i] < arrNbrLst[j]) {
					int tmp = arrNbrLst[i];
					arrNbrLst[i] = arrNbrLst[j];
					arrNbrLst[j] = tmp;
				}
			}
		}

		for(int val : arrNbrLst) System.out.print(val + " ");
	}

}

Sorting Five Numbers

Write a program which reads five numbers and sorts them in descending order.

Input

Input consists of five numbers a, b, c, d and e (-100000 ≤ a, b, c, d,e ≤ 100000). The five numbers are separeted by a space.

Output

Print the ordered numbers in a line. Adjacent numbers should be separated by a space.

Sample Input

3 6 9 7 5

Output for the Sample Input

9 7 6 5 3


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		int n = stdIn.nextInt();
		for (int i = 0; i < n; i++) {
			double[] xy = new double[8];
			for (int j = 0; j < 8; j++) {
				xy[j] = stdIn.nextDouble();
			}
			double m = (xy[2] - xy[0]) * (xy[7] - xy[5]) - (xy[3] - xy[1]) * (xy[6] - xy[4]);
			if(m==0){
				System.out.println("YES");
			}
			else{
				System.out.println("NO");
			}
		}
	}
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Parallelism

There are four points: $A(x_1, y_1)$, $B(x_2, y_2)$, $C(x_3, y_3)$, and $D(x_4, y_4)$. Write a program which determines whether the line $AB$ and the line $CD$ are parallel. If those two lines are parallel, your program should prints "YES" and if not prints "NO".

Input

Input consists of several datasets. In the first line, you are given the number of datasets $n$ ($n \leq 100$). There will be $n$ lines where each line correspondgs to each dataset. Each dataset consists of eight real numbers:

$x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$ $x_4$ $y_4$

You can assume that $-100 \leq x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4 \leq 100$.
Each value is a real number with at most 5 digits after the decimal point.

Output

For each dataset, print "YES" or "NO" in a line.

Sample Input

2
0.0 0.0 1.0 1.0 1.0 0.0 2.0 1.0
3.0 2.0 9.0 6.0 13.0 5.0 7.0 9.0

Output for the Sample Input

YES
NO


import java.io.*;
import java.math.BigInteger;
import java.util.*;

class Main {

	public static int maxCalc (int[] nums) {

		int max = Integer.MIN_VALUE;
		int sum = 0;

		// いくつ連続でとるか
		for (int i = 1; i <= nums.length; i++) {

			// どこから取り始めるか
			for (int j = 0; j < nums.length - i + 1; j++) {

				sum = 0;
				int cnt = 0;

				// 取った数がiになるまで繰り返し
				for (int k = j; cnt < i; k++,cnt++) {
					sum += nums[k];
				}
				max = Math.max(sum, max);

			}

		}
		return max;

	}

	public static void main(String[] args) throws IOException {

		BufferedReader br =
			new BufferedReader(new InputStreamReader(System.in));

		ArrayList<Integer> ans = new ArrayList<Integer>();

		while (true) {

			int n = Integer.parseInt(br.readLine());
			if (n == 0) break;
			int[] nums = new int[n];
			for (int i = 0; i < n; i++)
				nums[i] = Integer.parseInt(br.readLine());
			ans.add(maxCalc(nums));

		}

		for (int a : ans) {
			System.out.println(a);
		}

	}

}

Maximum Sum Sequence

Given a sequence of numbers a1, a2, a3, ..., an, find the maximum sum of a contiguous subsequence of those numbers. Note that, a subsequence of one element is also a contiquous subsequence.

Input

The input consists of multiple datasets. Each data set consists of:

n
a1
a2
.
.
an

You can assume that 1 ≤ n ≤ 5000 and -100000 ≤ ai ≤ 100000.

The input end with a line consisting of a single 0.

Output

For each dataset, print the maximum sum in a line.

Sample Input

7
-5
-1
6
4
9
-6
-7
13
1
2
3
2
-2
-1
1
2
3
2
1
-2
1
3
1000
-200
201
0

Output for the Sample Input

19
14
1001


import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args)throws IOException{
		Scanner scan = null;
		try{
			scan = new Scanner(new InputStreamReader(System.in));
			while(scan.hasNext()){
				int n = scan.nextInt();
				if(n == 0)break;
				int max;
				List<Integer> dataset = new ArrayList<Integer>();
				dataset.add(max = scan.nextInt());
				for(int i = 1;i<n;i++)
					dataset.add(max = scan.nextInt());
				for(int i = 0; i < n; i++){
					int sum = 0;
					for(int j = i; j<n;j++){
						max = Math.max(sum += dataset.get(j), max);
					}
				}
				System.out.println(max);
			}
		}finally{
			scan.close();
		}

	}
}


import java.io.IOException;
import java.util.*;

/**
 */
class Main {
	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(System.in);

		while(in.hasNext()) {
			List<Integer> ai = new ArrayList<Integer>();
			List<Integer> bi = new ArrayList<Integer>();

			for(int i=0;i<4;i++) ai.add(in.nextInt());
			for(int i=0;i<4;i++) bi.add(in.nextInt());

			Map<Integer, Integer> hit = new HashMap<Integer, Integer>();
			for(int i=0;i<4;i++) {
				if(ai.get(i) == bi.get(i)) {
					hit.put(ai.get(i), 1);
				}
			}

			int blow = 0;
			for(int i=0;i<4;i++) {
				if(hit.containsKey(bi.get(i)) == false && ai.contains(bi.get(i))) {
					blow++;
				}
			}
			System.out.println(String.format("%d %d",hit.size(),blow));
		}
	}
}

Hit and Blow

Let's play Hit and Blow game. A imagines four numbers and B guesses the numbers. After B picks out four numbers, A answers:

The number of numbers which have the same place with numbers A imagined (Hit)

The number of numbers included (but different place) in the numbers A imagined (Blow)

For example, if A imagined numbers:

9 1 8 2

and B chose:

4 1 5 9

A should say 1 Hit and 1 Blow.

Write a program which reads four numbers A imagined and four numbers B chose and prints the number of Hit and Blow respectively. You may assume that the four numbers are all different and within from 0 to 9.

Input

The input consists of multiple datasets. Each dataset set consists of:

a1 a2 a3 a4
b1 b2 b3 b4

, where ai (0 ≤ ai ≤ 9) is i-th number A imagined and bi (0 ≤ bi ≤ 9) is i-th number B chose.

The input ends with EOF. The number of datasets is less than or equal to 50.

Output

For each dataset, print the number of Hit and Blow in a line. These two numbers should be separated by a space.

Sample Input

9 1 8 2
4 1 5 9
4 6 8 2
4 6 3 2

Output for the Sample Input

1 1
3 0


import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    private static final Map<Integer, DropMode> dropMode;

    static {
        dropMode = new HashMap<Integer, Main.DropMode>();
        dropMode.put(1, new DropModeStar(1));
        dropMode.put(2, new DropModeSquare(1));
        dropMode.put(3, new DropModeStar(2));
    }

    public static void main(String[] args) {
        try {
            int[][] field = new int[10][10];

            Scanner sc = new Scanner(System.in);

            while (sc.hasNext()) {
                String[] arguments = sc.next().split(",");
                int x = Integer.valueOf(arguments[0]);
                int y = Integer.valueOf(arguments[1]);
                int size = Integer.valueOf(arguments[2]);

                dropMode.get(size).drop(field, x, y);
            }

            System.out.println(getWhiteCells(field));
            System.out.println(getMostDropped(field));

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }

    }

    private static int getWhiteCells(int[][] field) {
        int result = 0;
        for (int[] row : field) {
            for (int cell : row) {
                if (cell == 0) {
                    result++;
                }
            }
        }
        return result;
    }

    private static int getMostDropped(int[][] field) {
        int result = 0;
        for (int[] row : field) {
            for (int cell : row) {
                if (cell > result) {
                    result = cell;
                }
            }
        }
        return result;
    }

    private static abstract class DropMode {
        protected int size;

        public DropMode(int size) {
            this.size = size;
        }

        public abstract void drop(int[][] field, int x, int y);
    }

    /** x + y = ±sizeにDrop */
    private static class DropModeStar extends DropMode {
        public DropModeStar(int size) {
            super(size);
        }

        @Override
        public void drop(int[][] field, int x, int y) {
            for (int oy = -1 * this.size; oy <= this.size; oy++) {
                if (y + oy < 0 || y + oy > 9) {
                    continue;
                }

                for (int ox = -1 * (this.size - Math.abs(oy)); ox <= (this.size - Math
                        .abs(oy)); ox++) {
                    if (x + ox < 0 || x + ox > 9) {
                        continue;
                    }

                    field[y + oy][x + ox]++;
                }
            }
        }
    }

    /** x = ±size, y = ±sizeにDrop */
    private static class DropModeSquare extends DropMode {
        public DropModeSquare(int size) {
            super(size);
        }

        @Override
        public void drop(int[][] field, int x, int y) {
            for (int oy = -1 * this.size; oy <= this.size; oy++) {
                if (y + oy < 0 || y + oy > 9) {
                    continue;
                }

                for (int ox = -1 * this.size; ox <= this.size; ox++) {
                    if (x + ox < 0 || x + ox > 9) {
                        continue;
                    }

                    field[y + oy][x + ox]++;
                }
            }
        }
    }

}

Dropping Ink

As shown in the following figure, there is a paper consisting of a grid structure where each cell is indicated by (x, y) coordinate system.

We are going to put drops of ink on the paper. A drop comes in three different sizes: Large, Medium, and Small. From the point of fall, the ink sinks into surrounding cells as shown in the figure depending on its size. In the figure, a star denotes the point of fall and a circle denotes the surrounding cells.

Originally, the paper is white that means for each cell the value of density is 0. The value of density is increased by 1 when the ink sinks into the corresponding cells.

For example, if we put a drop of Small ink at (1, 2) and a drop of Medium ink at (3, 2), the ink will sink as shown in the following figure (left side):

In the figure, density values of empty cells are 0. The ink sinking into out of the paper should be ignored as shown in the figure (top side). We can put several drops of ink at the same point.

Your task is to write a program which reads a sequence of points of fall (x, y) with its size (Small = 1, Medium = 2, Large = 3), and prints the number of cells whose density value is 0. The program must also print the maximum value of density.

You may assume that the paper always consists of 10 × 10, and 0 ≤ x < 10, 0 ≤ y < 10.

Input

x1,y1,s1
x2,y2,s2
:
:

(xi, yi) represents the position of the i-th drop and si denotes its size. The number of drops is less than or equal to 50.

Output

Print the number of cells whose density value is 0 in first line.

Print the maximum value of density in the second line.

Sample Input

2,5,3
3,6,1
3,4,2
4,5,2
3,6,3
2,4,1

Output for the Sample Input

77
5


import java.util.Scanner;

class Main{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String str="";
		String[] stck=new String[3];
		int[] matome=new int[3];
		int hen3=0;
		int c_ks=0;
		int h_ks=0;

		int[] cyouhou_kake=new int[100];
		int[] cyouhou_tasu=new int[100];
		int[] cyouhou_kosu=new int[100];
		int[] heikshn_kake=new int[100];
		int[] heikshn_tasu=new int[100];
		int[] heikshn_kosu=new int[100];

		boolean add=false;

		while(sc.hasNext()) {
		//for(int aa=0; aa<4; aa++){
			hen3=0;
			str=sc.next();
			stck=str.split(",");
			for(int i=0; i<3; i++) {
				matome[i]=Integer.parseInt(stck[i]);
				hen3+=matome[i];
			}

			int a,b,c;
			a=Math.max(Math.max(matome[0], matome[1]), matome[2]);
			b=Math.min(Math.min(matome[0], matome[1]), matome[2]);
			c=hen3-a-b;
			//System.out.println(a+" "+b+" "+c);

			if(a*a==b*b+c*c) {
				if(c_ks==0) {
					cyouhou_kake[0]=a*c*b;
					cyouhou_tasu[0]=a+c+b;
					cyouhou_kosu[0]=1;
					c_ks++;
					add=true;
				}
				else {
					for(int i=0; i<c_ks; i++) {
						if(a*b*c==cyouhou_kake[i] && a+b+c==cyouhou_tasu[i]) {
							cyouhou_kosu[i]++;
							add=true;
						}
					}
					if(add==false) {
						cyouhou_kake[c_ks]=a*c*b;
						cyouhou_tasu[c_ks]=a+b+c;
						cyouhou_kosu[c_ks]=1;
						c_ks++;
						add=true;
					}
				}
			}

			/*else if(a*a!=b*b+c*c && (a==b || a==c || b==c)) {
				if(h_ks==0) {
					heikshn_kake[0]=a*c*b;
					heikshn_tasu[0]=a+c+b;
					heikshn_kosu[0]=1;
					h_ks++;
					add=true;
				}
				else {
					for(int i=0; i<h_ks; i++) {
						if(a*b*c==heikshn_kake[i] && a+b+c==heikshn_tasu[i]) {
							heikshn_kosu[i]++;
							add=true;
						}
					}
					if(add==false) {
						heikshn_kake[h_ks]=a*c*b;
						heikshn_tasu[h_ks]=a+b+c;
						heikshn_kosu[h_ks]=1;
						h_ks++;
						add=true;
					}
				}
			}*/
			else {
				h_ks++;
			}
		}

		int sei=0;
		int his=0;
		for(int i=0; i<100; i++) {
			sei+=cyouhou_kosu[i]/2;
		}
		his=h_ks;

		System.out.println(sei);
		System.out.println(his);
	}
}

プラスティック板

機械に辺・対角線の長さのデータを入力し、プラスティック板の型抜きをしている工場があります。この工場では、サイズは様々ですが、平行四辺形の型のみを切り出しています。あなたは、切り出される平行四辺形のうち、長方形とひし形の製造個数を数えるように上司から命じられました。

「機械に入力するデータ」を読み込んで、長方形とひし形の製造個数を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

a1,b1,c1
a2,b2,c2
:

機械に入力するデータが複数行に与えられます。i 行目に i 番目の平行四辺形の隣り合う２辺の長さを表す整数 ai, bi と対角線の長さを表す整数 ci がカンマ区切りで与えられます (1 ≤ ai, bi, ci ≤ 1000, ai + bi > ci)。データの数は 100 件を超えません。

Output

１行目に長方形の製造個数、２行目ひし形の製造個数を出力します。

Sample Input

3,4,5
5,5,8
4,4,4
5,4,3

Output for the Sample Input

1
2


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		int n = 0;
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();

		for(int i = 0; i < n; i++) {
			int left = Integer.MIN_VALUE, right = Integer.MIN_VALUE;
			boolean isCorrect = true;

			for(int j = 0; j < 10; j++) {
				int ball = scan.nextInt();
				if(ball > left) {
					left = ball;
				} else if(ball > right) {
					right = ball;
				} else {
					isCorrect = false;
				}
			}

			System.out.println(isCorrect ? "YES" : "NO");
		}

		scan.close();
	}

}

玉

図のように二股に分かれている容器があります。1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし、左の筒 B か右の筒 C に玉を入れます。板 D は支点 E を中心に左右に回転できるので、板 D を動かすことで筒 B と筒 C のどちらに入れるか決めることができます。

開口部 A から落とす玉の並びを与えます。それらを順番に筒 B 又は筒 Cに入れていきます。このとき、筒 B と筒 C のおのおのが両方とも番号の小さい玉の上に大きい玉を並べられる場合は YES、並べられない場合は NO と出力するプログラムを作成してください。ただし、容器の中で玉の順序を入れ替えることはできないものとします。また、続けて同じ筒に入れることができるものとし、筒 B, C ともに 10 個の玉がすべて入るだけの余裕があるものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 N が与えられます。つづいて、N 行のデータセットが与えられます。各データセットに 10 個の番号が左から順番に空白区切りで与えられます。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

2
3 1 4 2 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

Output for the Sample Input

YES
NO


import java.util.*;
public class Main {
	Scanner in = new Scanner(System.in);
	public static void main(String[] args){
		new Main();
	}

	public Main(){
		new AOJ0042();
	}
	class AOJ0042{
//		int w,n;
//		tresure[] takara;
		public AOJ0042() {
			int c=1;
			while(true){
				int w = in.nextInt();
				if(w==0)break;
				int n = in.nextInt();
				tresure[] takara = new tresure[n];
				for(int i=0;i<n;i++){
					String[] a = in.next().split(",");
					takara[i]=new tresure(Integer.parseInt(a[0]),Integer.parseInt(a[1]));
				}
				int[] dp = new int[w+1];
				for(int s=0;s<n;s++){
					for(int i=0;i<=w;i++)if(dp[i]>0){
						if(takara[s].heavy+i<=w)dp[takara[s].heavy+i]=Math.max(dp[takara[s].heavy+i],dp[i]+takara[s].money);
					}
					if(takara[s].heavy<=w)dp[takara[s].heavy]=Math.max(dp[takara[s].heavy],takara[s].money);
				}
				int max_heavy=0;
				int max_money=0;
				for(int i=0;i<w;i++)if(max_money<dp[i]){
					max_money=dp[i];
					max_heavy=i;
				}
				System.out.println("Case "+c+":");
				c++;
				System.out.println(max_money);
				System.out.println(max_heavy);
			}
		}
		class tresure{
			int money,heavy;
			public tresure(int money,int heavy) {
				this.money=money;
				this.heavy=heavy;
			}
		}
	}
}

泥棒

宝物がたくさん収蔵されている博物館に、泥棒が大きな風呂敷を一つだけ持って忍び込みました。盗み出したいものはたくさんありますが、風呂敷が耐えられる重さが限られており、これを超えると風呂敷が破れてしまいます。そこで泥棒は、用意した風呂敷を破らず且つ最も価値が高くなるようなお宝の組み合わせを考えなくてはなりません。

風呂敷が耐えられる重さ W、および博物館にある個々のお宝の価値と重さを読み込んで、重さの総和が W を超えない範囲で価値の総和が最大になるときの、お宝の価値総和と重さの総和を出力するプログラムを作成してください。ただし、価値の総和が最大になる組み合わせが複数あるときは、重さの総和が小さいものを出力することとします。

Input

複数のデータセットが与えられます。各データセットは以下のような形式で与えられます。

W
N
v1,w1
v2,w2
:
vN,wN

１行目に風呂敷の耐えられる重さを表す整数 W (W ≤ 1,000)、２行目にお宝の数 N (1 ≤ N ≤ 1,000) が与えられます。続く N 行に i 番目のお宝の価値を表す整数 vi (0 ≤ vi ≤ 10,000) とその重さを表す整数 wi (0 ≤ wi ≤ W) の組がそれぞれ１行に与えられます。

W が 0 のとき入力の最後とします。データセットの数は 50 を超えません。

Output

各データセットに対して以下のように出力して下さい。

Case データセットの番号:
風呂敷に入れたお宝の価値総和
そのときのお宝の重さの総和

Sample Input

50
5
60,10
100,20
120,30
210,45
10,4
50
5
60,10
100,20
120,30
210,45
10,4
0

Output for the Sample Input

Case 1:
220
49
Case 2:
220
49


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;

class Main {

    public static void main(String[] args) throws IOException {
        doit(args, System.in, System.out);
    }

    static void doit(String[] args, InputStream in, PrintStream out)
            throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        while (true) {
            String line = reader.readLine();
            if (line == null || line.isEmpty()) {
                break;
            }
            int[][] counts = new int[6][9];
            for (int i = 0; i < 13; i++) {
                counts[0][line.charAt(i) - '1']++;
            }
            boolean found = false;
            for (int i = 0; i < 9; i++) {
                if (counts[0][i] == 4) {
                    continue;
                }
                System.arraycopy(counts[0], 0, counts[1], 0, 9);
                counts[1][i]++;
                for (int j = 0; j < 9; j++) {
                    if (counts[1][j] < 2) {
                        continue;
                    }
                    System.arraycopy(counts[1], 0, counts[2], 0, 9);
                    counts[2][j] -= 2;
                    if (check(counts, 2)) {
                        if (!found) {
                            found = true;
                        } else {
                            out.print(' ');
                        }
                        out.print(i + 1);
                    }
                }
            }
            if (!found) {
                out.print(0);
            }
            out.println();
        }
    }

    private static boolean check(int[][] counts, int r) {
        for (int k = 0; k < 9; k++) {
            if (counts[r][k] == 0) {
                continue;
            }
            if (k < 7 && counts[r][k + 1] > 0 && counts[r][k + 2] > 0) {
                if (r == 5) {
                    return true;
                }
                System.arraycopy(counts[r], 0, counts[r + 1], 0, 9);
                counts[r + 1][k]--;
                counts[r + 1][k + 1]--;
                counts[r + 1][k + 2]--;
                if (check(counts, r + 1)) {
                    return true;
                }
            }
            if (counts[r][k] >= 3) {
                if (r == 5) {
                    return true;
                }
                System.arraycopy(counts[r], 0, counts[r + 1], 0, 9);
                counts[r + 1][k] -= 3;
                if (check(counts, r + 1)) {
                    return true;
                }
            }
        }
        return false;
    }
}

パズル

1 〜 9 の数字を 14 個組み合わせて完成させるパズルがあります。与えられた 13 個の数字にもうひとつ数字を付け加えて完成させます。

パズルの完成条件は

同じ数字を２つ組み合わせたものが必ずひとつ必要です。

残りの12 個の数字は、３個の数字の組み合わせ４つです。

３個の数字の組み合わせ方は、同じ数字を３つ組み合わせたものか、または３つの連続する数字を組み合わせたものです。ただし、9 1 2 のような並びは連続する数字とは認められません。

同じ数字は4 回まで使えます。

13 個の数字からなる文字列を読み込んで、パズルを完成することができる数字を昇順に全て出力するプログラムを作成してください。なお、1〜9 のどの数字を付け加えてもパズルを完成させることができないときは 0 を出力してください。

例えば与えられた文字列が 3456666777999 の場合

「2」があれば、　234 567 666 77 999

「3」があれば、　33 456 666 777 999

「5」があれば、　345 567 666 77 999

「8」があれば、　345 666 678 77 999

というふうに、2 3 5 8 のいずれかの数字が付け加えられるとパズルは完成します。「6」でも整いますが、5 回目の使用になるので、この例では使えないことに注意してください。

Input

入力は複数のデータセットからなります。各データセットとして、13 個の数字が１行に与えられます。データセットの数は 50 を超えません。

Output

データセットごとに、パズルを完成させることができる数字を昇順に空白区切りで１行に出力します。

Sample Input

3649596966777
6358665788577
9118992346175
9643871425498
7755542764533
1133557799246

Output for the Sample Input

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


import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main{

	Scanner sc;

	static final int INF=1<<28;
	static final double EPS=1e-9;

	void run(){
		sc=new Scanner(System.in);
		for(; sc.hasNext();){
			int n=sc.nextInt();
			int p=n-1;
			int q=n+1;
			while(!isPrime(p))
				p--;
			while(!isPrime(q))
				q++;
			println(p+" "+q);
		}
		sc.close();
	}

	boolean isPrime(int n){
		for(int i=2; i<n; i++)
			if(n%i==0)
				return false;
		return true;
	}

	void print(String s){
		System.out.print(s);
	}

	void println(String s){
		System.out.println(s);
	}

	public static void main(String[] args){
		new Main().run();
	}
}

素数 II

素数というのは、1 よりも大きくそれ自身か 1 でしか割りきれない整数をいいます。例えば、2 は、2 と 1 でしか割り切れないので素数ですが、12 は、12 と 1 のほかに、2, 3, 4, 6 で割りきれる数なので素数ではありません。

整数 n を入力したとき、n より小さい素数のうち最も大きいものと、n より大きい素数のうち最も小さいものを出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットに n (3 ≤ n ≤ 50,000) が１行に与えられます。

データセットの数は 50 を超えません。

Output

各データセットに対して、n より小さい素数のうち最大のものと、n より大きい素数のうち最小のものを１つのスペースで区切って１行に出力して下さい。

Sample Input

19
3517

Output for the Sample Input

17 23
3511 3527


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main
{
  public static void main(String[] args) throws NumberFormatException, IOException
  {
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    ArrayList<Float> inputList = new ArrayList<>();

    while (input.ready())
    {
      inputList.add(Float.parseFloat(input.readLine()));
    }
    final float ans = getDiffHight(inputList);
    System.out.println(ans);
  }

  private static float getDiffHight(ArrayList<Float> list)
  {
    float maxHight = Float.MIN_VALUE;
    float minHight = Float.MAX_VALUE;

    for (Float each : list)
    {
      if (each > maxHight)
      {
        maxHight = each;
      }
      if (each < minHight)
      {
        minHight = each;
      }
    }
    return maxHight - minHight;
  }
}

標高差

今まで登ったことのある山の標高を記録したデータがあります。このデータを読み込んで、一番高い山と一番低い山の標高差を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

山の高さ
...
...

山の高さが複数行に渡って与えられます。入力される値はすべて 0 以上 1,000,000 以下の実数です。入力される山の高さの数は 50 以下です。

Output

一番高い山と一番低い山の標高差を実数で出力する。出力は0.01以下の誤差を含んでもよい。

Sample Input

3776.0
1819.0
645.2
2004.1
1208.6

Output for the Sample Input

3130.8


import java.util.Scanner;
import java.util.Arrays;

class Main
{
	public static void main(String args[])
	{
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for (int i = 0; i < n; i++)
		{
			char num[] = sc.next().toCharArray();
			Arrays.sort(num);
			String str = new String(num);
			Scanner minNumSc = new Scanner(str);
			int min = minNumSc.nextInt();
			Scanner maxNumSc = new Scanner((new StringBuffer(str).reverse()).toString());
			int max = maxNumSc.nextInt();
			System.out.println(max - min);
		}
	}
}

整数の差

8 個の 0 から 9 までの数字を入力したとき、その 8 個の数字を並べ替えてできる、最大の整数と最小の整数の差を出力するプログラムを作成してください。並び替えてできる数は 00135569 のように 0 から始まってもよいものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 n (n ≤ 50) が与えられます。続いて n 行のデータが与えられます。各データは 8 個の数字の並び（0 から 9 の数字）です。

Output

各データセットに対して、入力された数字を並べ替えてできる最大の整数と最小の整数の差を１行に出力して下さい。

Sample Input

2
65539010
65539010

Output for the Sample Input

96417531
96417531


import java.io.*;

class Main{
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line="";
while((line=br.readLine())!=null){
String[] values=line.split(" ");
double xa=Double.parseDouble(values[0]);
double ya=Double.parseDouble(values[1]);
double xb=Double.parseDouble(values[2]);
double yb=Double.parseDouble(values[3]);
double xc=Double.parseDouble(values[4]);
double yc=Double.parseDouble(values[5]);
double xd=Double.parseDouble(values[6]);
double yd=Double.parseDouble(values[7]);
if(xa==xb){
if(yc==yd){
System.out.println("YES");
}
else{
System.out.println("NO");
}
continue;
}
if(xc==xd){
if(ya==yb){
System.out.println("YES");
}
else{
System.out.println("NO");
}
continue;
}
double mab=(ya-yb)/(xa-xb);
double mcd=(yc-yd)/(xc-xd);
System.out.println((mab*mcd==-1?"YES":"NO"));
}
}
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

直交判定

平面上の異なる 4 点、$A (x_A, y_A)$, $B (x_B, y_B)$, $C (x_C, y_C)$, $D (x_D, y_D)$ の座標を読み込んで、直線 $AB$ と $CD$ が直交する場合には YES、直交しない場合には NO と出力するプログラムを作成してください。ここで、「直線」とは線分のことではありません。以下の図を参考にして下さい。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです。

$x_A$ $y_A$ $x_B$ $y_B$ $x_C$ $y_C$ $x_D$ $y_D$

$x_A$, $y_A$, $x_B$, $y_B$, $x_C$, $y_C$, $x_D$, $y_D$ はそれぞれ -100 以上 100 以下であり、各値は小数点以下最大 5 桁までの数字を含む実数で与えられます。

データセットの数は 100 を超えません。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

1.0 1.0 2.0 2.0 0.0 0.0 1.0 -1.0
0.0 0.0 2.0 0.0 -1.0 2.0 2.0 2.0
10.0 6.0 3.4 5.2 6.8 9.5 4.3 2.1
2.5 3.5 2.5 4.5 -3.3 -2.3 6.8 -2.3

Output for the Sample Input

YES
NO
NO
YES


import java.io.*;
import java.util.regex.*;
public class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
		Pattern p = Pattern.compile("\\d++");
		String str = new String();
		while(true) {
			String s = r.readLine();
			str += s;
			if(s == null) break;
		}
		if(!p.matcher(str).matches()) {
			System.out.println("0");
		} else {
			String[] m = p.split(str);
			for(String s : m) {
				str = str.replace(s, " ");
			}
			m = str.split(" ");
			int sum = 0;
			for(String s : m) {
				if(s.length() > 0) {
					sum += Integer.valueOf(s);
				}
			}
			System.out.println(sum);
		}
	}
}

暗証番号

新しい暗証番号は覚えにくいものです。メモするのはダメといわれましたが、覚えられそうにありません。そこで文章の中に数値を埋め込んで暗証番号をメモすることにしました。ここでは全ての数値の和が暗証番号になります。

メモされた文章を読み込んで、暗証番号を出力するプログラムを作成してください。

Input

正の整数が埋め込まれた文章が複数行にわたり与えられます。各行は半角英数字、記号、空白を含む文字列または空行です。
ただし、入力は 1 行あたり 80 文字以内で、暗証番号は 10,000 以下であることが保障されています。

Output

暗証番号（文章中の正の整数の合計）を１行に出力します。

Sample Input

Thereare100yenonthetable.Iam17yearsold.
Ishouldgohomeat6pm.

Output for the Sample Input

123


import java.util.*;
public class Main{
    static Scanner kbd = new Scanner(System.in);
    public static void main(String[] args){
	solve();
    }

    static void solve(){
	boolean[] x = new boolean[1001];
	int[] y = new int[1001];
	int term = 0, i=0;
	String a, b="";

	while(kbd.hasNext()){
	    String s = kbd.next();
	    if(s.equals("")){
		term = 1;
	    }
	    else{
		while(!s.substring(i, i+1).equals(",")){
		    a = s.substring(i, i+1);
		    b += a;
		    i++;
		}
		int p = Integer.parseInt(b);
		b = "";
		if(term==0){
		    x[p] = true;
		    y[p] ++;
		}
		else{
		    x[p] = x[p]&&true;
		    y[p] ++;
		}
		i=0;
	    }
	}

	for(i=0; i<x.length; i++){
	    if(x[i] && y[i]>1)
		System.out.println(i+" "+y[i]);
	}
    }
}

取引

取引先の顧客番号と取引日を月ごとに記録したデータがあります。今月のデータと先月のデータを読み込んで、先月から２ヶ月連続で取引のある会社の顧客番号と取引のあった回数を出力するプログラムを作成してください。ただし、月々の取引先数は 1,000 社以内です。

Input

今月のデータと、先月のデータが１行の空行で区切られて与えられます。それぞれのデータは以下のような形式で与えられます。

c1,d1
c2,d2
...
...

ci (1 ≤ ci ≤ 1,000) は顧客番号を表す整数、 di (1 ≤ di ≤ 31) は取引日を表す整数です。

Output

２ヶ月連続で取引のある会社について、顧客番号が小さい順に顧客番号と取引回数の総数を空白で区切って出力します。

Sample Input

123,10
56,12
34,14

123,3
56,4
123,5

Output for the Sample Input

56 2
123 3


import java.util.*;

public class Main{
   public static void main(String[] args) {
	  Scanner sc =new Scanner(System.in);
   while(sc.hasNext()){
String s=sc.nextLine();
String in[]=s.split(",");

int a=Integer.parseInt(in[0]);
double b=Double.parseDouble(in[1]);
double c=Double.parseDouble(in[2]);
c*=c;
if(b/c>=25)System.out.println(a);
   }
   }
   }

BMI

肥満は多くの成人病の原因として挙げられています。過去においては、一部の例外を除けば、高校生には無縁なものでした。しかし、過度の受験勉強等のために運動不足となり、あるいはストレスによる過食症となることが、非現実的なこととはいえなくなっています。高校生にとっても十分関心を持たねばならない問題になるかもしれません。

そこで、あなたは、保健室の先生の助手となって、生徒のデータから肥満の疑いのある生徒を探し出すプログラムを作成することになりました。

方法は BMI (Body Mass Index) という数値を算出する方法です。BMIは次の式で与えられます。

BMI = 22 が標準的で、25 以上だと肥満の疑いがあります。

各々の生徒の体重、身長の情報から BMI を算出し、25 以上の生徒の学籍番号を出力するプログラムを作成してください。

入力

入力は以下の形式で与えられます。

s1,w1,h1
s2,w2,h2
...
...

si (1 ≤ si ≤ 2,000)、wi (1 ≤ wi ≤ 200)、hi (1.0 ≤ hi ≤ 2.0) はそれぞれ、i 番目の生徒の学籍番号（整数）、体重（実数）、身長（実数）を表します。

生徒の数は 50 を超えません。

出力

BMI が 25 以上の生徒の学籍番号を、入力された順番にそれぞれ１行に出力します。

Sample Input

1001,50.0,1.60
1002,60.0,1.70
1003,70.0,1.80
1004,80.0,1.70
1005,90.0,1.60

Output for the Sample Input

1004
1005


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		//??????????????°
		double bmi;
		String [][] kiroku = new String[50][3];
		double [][] date = new double[50][3];

		//????????£????????????
		Scanner scan = new Scanner(System.in);

		//BMI??????
		int i = 0;
		int j=0;

		//????????????
		while(scan.hasNext()){
		//?¨??????????
				String str = scan.next();
				kiroku[i] = str.split(",");
				date [i][1]= Double.parseDouble(kiroku[i][1]);
				date [i][2]= Double.parseDouble(kiroku[i][2]);
			i++;

		}
		for(int x = 0 ; x < date.length ; x++){
			bmi = date[x][1] / (date[x][2] * date[x][2]);
			if(bmi >= 25){
				System.out.println(kiroku[x][0]);
			}
		}
	}
}


import java.io.InputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.math.BigInteger;

public class Main{

static PrintWriter out;
static InputReader ir;
static int total,res;
static final int[] sx={0,0,1,0,-1},sy={0,1,0,-1,0},mx={0,0,1,0,-1,-1,-1,1,1},my={0,1,0,-1,0,-1,1,-1,1},lx={0,0,1,0,-1,-1,-1,1,1,0,2,0,-2},ly={0,1,0,-1,0,-1,1,-1,1,2,0,-2,0};
static int[][] map=new int[10][10];
static int[][][] drop=new int[10][10][3];

static void sd(int x,int y){
 for(int i=0;i<sx.length;i++){
  map[x+sx[i]][y+sy[i]]--;
 }
 total-=5;
 res--;
}

static void sr(int x,int y){
 for(int i=0;i<sx.length;i++){
  map[x+sx[i]][y+sy[i]]++;
 }
 total+=5;
 res++;
}

static boolean scd(int x,int y){
 for(int i=0;i<sx.length;i++){
  int nx=x+sx[i];
  int ny=y+sy[i];
  if(nx<0||ny<0||nx>=10||ny>=10||map[nx][ny]==0){
   return false;
  }
 }
 return true;
}

static void md(int x,int y){
 for(int i=0;i<mx.length;i++){
  map[x+mx[i]][y+my[i]]--;
 }
 total-=9;
 res--;
}

static void mr(int x,int y){
 for(int i=0;i<mx.length;i++){
  map[x+mx[i]][y+my[i]]++;
 }
 total+=9;
 res++;
}

static boolean mcd(int x,int y){
 for(int i=0;i<mx.length;i++){
  int nx=x+mx[i];
  int ny=y+my[i];
  if(nx<0||ny<0||nx>=10||ny>=10||map[nx][ny]==0){
   return false;
  }
 }
 return true;
}

static void ld(int x,int y){
 for(int i=0;i<lx.length;i++){
  map[x+lx[i]][y+ly[i]]--;
 }
 total-=13;
 res--;
}

static void lr(int x,int y){
 for(int i=0;i<lx.length;i++){
  map[x+lx[i]][y+ly[i]]++;
 }
 total+=13;
 res++;
}

static boolean lcd(int x,int y){
 for(int i=0;i<lx.length;i++){
  int nx=x+lx[i];
  int ny=y+ly[i];
  if(nx<0||ny<0||nx>=10||ny>=10||map[nx][ny]==0){
   return false;
  }
 }
 return true;
}

static void solve(){
 res=ir.nextInt();
 total=0;
 for(int i=0;i<10;i++){
  for(int j=0;j<10;j++){
   map[i][j]=ir.nextInt();
   total+=map[i][j];
  }
 }
 if(search(1,1,3)){
  for(int i=1;i<9;i++){
   for(int j=1;j<9;j++){
    for(int k=0;k<3;k++){
     if(drop[i][j][k]!=0){
      for(int l=0;l<drop[i][j][k];l++){
       out.println(j+" "+i+" "+k+1);
      }
     }
    }
   }
  }
 }
}

static boolean searchnext(int x,int y){
 if(x==8){
  return search(1,y+1,3);
 }
 return search(x+1,y,3);
}

static boolean search(int x,int y,int size){
 if(res==0&&total==0){
  return true;
 }
 else if(total<res*5||total>res*13){
  return false;
 }
 else if(res==0){
  return false;
 }
 if(y==9){
  return false;
 }
 if(y>2&&x==1){
  for(int i=0;i<10;i++){
   if(map[i][y-3]!=0){
    return false;
   }
  }
 }
 while(true){
  switch(size){
   case 3:if(lcd(x,y)){
           ld(x,y);
           drop[x][y][2]++;
           if(searchnext(x,y)){
            return true;
           }
           else{
            if(scd(x,y)&&search(x,y,3)){
             return true;
            }
            lr(x,y);
            drop[x][y][2]--;
           }
          }
          size--;

   case 2:if(mcd(x,y)){
           md(x,y);
           drop[x][y][1]++;
           if(searchnext(x,y)){
            return true;
           }
           else{
            if(scd(x,y)&&search(x,y,2)){
            return true;
           }
           mr(x,y);
           drop[x][y][1]--;
          }
         }
         size--;

   case 1:if(scd(x,y)){
           sd(x,y);
           drop[x][y][0]++;
           if(searchnext(x,y)){
            return true;
           }
           else{
            if(scd(x,y)&&search(x,y,1)){
             return true;
            }
            sr(x,y);
            drop[x][y][0]--;
           }
          }
          size--;

   case 0:return searchnext(x,y);
  }
 }
}

public static void main(String[] args) throws Exception{
 ir=new InputReader(System.in);
 out=new PrintWriter(System.out);
 solve();
 out.flush();
}

static class InputReader {
 private InputStream in;
 private byte[] buffer=new byte[1024];
 private int curbuf;
 private int lenbuf;

 public InputReader(InputStream in) {this.in=in; this.curbuf=this.lenbuf=0;}

 public boolean hasNextByte() {
  if(curbuf>=lenbuf){
   curbuf= 0;
   try{
    lenbuf=in.read(buffer);
   }catch(IOException e) {
    throw new InputMismatchException();
   }
   if(lenbuf<=0) return false;
  }
  return true;
 }

 private int readByte(){if(hasNextByte()) return buffer[curbuf++]; else return -1;}

 private boolean isSpaceChar(int c){return !(c>=33&&c<=126);}

 private void skip(){while(hasNextByte()&&isSpaceChar(buffer[curbuf])) curbuf++;}

 public boolean hasNext(){skip(); return hasNextByte();}

 public String next(){
  if(!hasNext()) throw new NoSuchElementException();
  StringBuilder sb=new StringBuilder();
  int b=readByte();
  while(!isSpaceChar(b)){
   sb.appendCodePoint(b);
   b=readByte();
  }
  return sb.toString();
 }

 public int nextInt() {
  if(!hasNext()) throw new NoSuchElementException();
  int c=readByte();
  while (isSpaceChar(c)) c=readByte();
  boolean minus=false;
  if (c=='-') {
   minus=true;
   c=readByte();
  }
  int res=0;
  do{
   if(c<'0'||c>'9') throw new InputMismatchException();
   res=res*10+c-'0';
   c=readByte();
  }while(!isSpaceChar(c));
  return (minus)?-res:res;
 }

 public long nextLong() {
  if(!hasNext()) throw new NoSuchElementException();
  int c=readByte();
  while (isSpaceChar(c)) c=readByte();
  boolean minus=false;
  if (c=='-') {
   minus=true;
   c=readByte();
  }
  long res = 0;
  do{
   if(c<'0'||c>'9') throw new InputMismatchException();
   res=res*10+c-'0';
   c=readByte();
  }while(!isSpaceChar(c));
  return (minus)?-res:res;
 }

 public double nextDouble(){return Double.parseDouble(next());}

 public BigInteger nextBigInteger(){return new BigInteger(next());}

 public int[] nextIntArray(int n){
  int[] a=new int[n];
  for(int i=0;i<n;i++) a[i]=nextInt();
  return a;
 }

 public long[] nextLongArray(int n){
  long[] a=new long[n];
  for(int i=0;i<n;i++) a[i]=nextLong();
  return a;
 }

 public char[][] nextCharMap(int n,int m){
  char[][] map=new char[n][m];
  for(int i=0;i<n;i++) map[i]=next().toCharArray();
  return map;
 }
}
}

Blur

図 1 のような 10×10 のマス目の「布」があり、（1，2）のようにX座標・Y座標の値の対でマス目を示すことにします。座標値は 0 から始まる整数とします。例えば、図 1 の◎の座標は (1, 2) です。
この「布」に染料を少しずつたらして染物を作ります。たらす染料の滴には「大」「中」「小」の 3 サイズがあり、染料の滴の落ちたマス目を中心に図 1 のように周囲も色がつきます。図 1 で☆が中心、○が色のにじむ範囲です。

「布」は、最初は「まっしろ」つまり、どのマス目も色の濃さを示す値が 0 とします。染料の滴が落ちるごとに値が 1 ずつ増えていきます。「小」が（1, 2）、「中」が（3, 2）に落ちた場合、各マス目の値は図 2 の左のようになります。染料がもったいないので、図 2 の右に示すようなにじむ範囲が布の外にはみ出すような染料の落とし方はしないことになっています。また、同じ場所に複数の染料をたらすこともあります。

このような作業を何回か繰り返した結果、布にすばらしい模様が浮かび上がりましたが、残念なことに、うっかり作業経過を記録し忘れてしまいました。どうにもさっぱり思い出せませんが、かろうじて、落とした染料の滴数は覚えていました。あなたは、すばらしい染物を再現しなければなりません。すばらしい染物のデータを読みこんで、どこに、どのような染料をたらしたかを出力するプログラムを作成してください。なお、落とした染料の滴数は 12 以下とします。

入力

入力の形式は以下のとおりです：

最初の 1 行に落とした染料の滴数 n が与えられます。次の行から 10 行に各座標の色の濃さが空白区切りで与えられます。

出力

出力は n 行からなります。染料の滴の「大」を 3、「中」を 2、「小」を 1 で表し、落とした染料ごとに、そのX座標、Y座標、滴の大きさを空白で区切って1行に出力してください。

染料のたらし方はどのような順番で出力しても良いものとします。

入力例1

2
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0
0 0 0 1 0 0 0 1 1 1
0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

出力例1

3 2 1
8 4 2

入力例2

6
0 0 1 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0
1 1 1 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0 0
0 0 1 1 1 3 1 1 0 0
0 0 1 1 3 1 1 1 0 0
0 0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 1 0 0

出力例2

2 2 3
7 7 3
6 3 2
3 6 2
4 4 1
5 5 1


import java.util.*;
public class Main {
    public static void main(String[] args) throws java.io.IOException{
        Scanner scan = new Scanner(System.in);

        while(true){
        	int n=scan.nextInt();
        	if(n==0)break;
        	long syatiku[] =new long[4001];
        	for(int i=0;i<4001;i++)syatiku[i] = 0;
        	int []  input =new int [n];
        	for(int i=0;i<n;i++){
        		input[i] = scan.nextInt();
        		syatiku[input[i]]+=scan.nextLong()*scan.nextLong();
        	}
        	boolean flag =true;
        	for(int i=0;i<n;i++){
        		if(syatiku[input[i]]>=1000000){
        			System.out.println(input[i]);
        			syatiku[input[i]] =0;
        			flag =false;
        		}
        	}
        	if(flag)System.out.println("NA");
        }
    }
}

Sale Result

There is data on sales of your company. Your task is to write a program which identifies good workers.

The program should read a list of data where each item includes the employee ID i, the amount of sales q and the corresponding unit price p. Then, the program should print IDs of employees whose total sales proceeds (i.e. sum of p × q) is greater than or equal to 1,000,000 in the order of inputting. If there is no such employees, the program should print "NA". You can suppose that n < 4000, and each employee has an unique ID. The unit price p is less than or equal to 1,000,000 and the amount of sales q is less than or equal to 100,000.

Input

The input consists of several datasets. The input ends with a line including a single 0. Each dataset consists of:

n (the number of data in the list)
i p q
i p q
:
:
i p q

Output

For each dataset, print a list of employee IDs or a text "NA"

Sample Input

4
1001 2000 520
1002 1800 450
1003 1600 625
1001 200 1220
2
1001 100 3
1005 1000 100
2
2013 5000 100
2013 5000 100
0

Output for the Sample Input

1001
1003
NA
2013


import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
	static int[][] list;
	public static void main(String[] args) {

		FastScanner sc = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
		while(true) {
			int n = sc.nextInt();
			if(n == 0) break;
			PriorityQueue<Integer> que = new PriorityQueue<Integer>(n);
			for(int i = 0; i < n; i++) {
				que.add(sc.nextInt());
			}
			long sum = 0;
			long time = 0;
			for(int i = 0; i < n; i++) {
				time += sum;
				sum += que.poll();
			}

			out.println(time);
		}
		out.flush();
	}
	static void solv(int a, int b, boolean[] c) {
		list[a][b]++;
		if(a == 9) return;
		if(b > 1000) return;

		for(int i = 0; i < 101; i++) {
			if(a == 8) {
				if(!c[i]) {
					list[a+1][b+i]++;
				}
			}

			else if(!c[i]) {
				c[i] = true;
				solv(a+1,b+i,c);
				c[i] = false;
			}
		}
	}
}
//------------------------------//
//-----------//
class FastScanner {
    private final InputStream in = System.in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int buflen = 0;
    private boolean hasNextByte() {
        if (ptr < buflen) {
            return true;
        }else{
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    }
    private int readByte() { if (hasNextByte()) return buffer[ptr++]; else return -1;}
    private static boolean isPrintableChar(int c) { return 33 <= c && c <= 126;}
    private void skipUnprintable() { while(hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;}
    public boolean hasNext() { skipUnprintable(); return hasNextByte();}
    public String next() {
        if (!hasNext()) throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while(isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }
    public long nextLong() {
        if (!hasNext()) throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while(true){
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            }else if(b == -1 || !isPrintableChar(b)){
                return minus ? -n : n;
            }else{
                throw new NumberFormatException();
            }
            b = readByte();
        }
    }

    public int nextInt() {
    	return (int)nextLong();
    }

}

ミルクショップ

鈴木さんは会津地域に新しく搾りたてミルクの移動販売のお店を開きました。その日買い求めに来るお客さんは全員持ち帰るためのボトルを持って既にお店に並んでいて、それ以上増えないものとします。お客さんはそれぞれ1回だけしか注文しません。タンクの蛇口が一つしかないので、一人ずつ順番に販売しなければなりません。そこで、鈴木さんはなるべく並んでいるお客さんの待ち時間を少なくしたいと考えています。

お客さんの人数とお客さんが牛乳を注ぎきるのに要する時間が入力として与えられます。あなたはお客さんの「一人一人の待ち時間の合計」(以下「待ち時間の合計」とする)を最小にするための注文の順序を鈴木さんに代わって調べ、そのときの「待ち時間の合計」を出力して終了するプログラムを作成してください。ただし、お客さんは 10,000 人以下で 1 人あたりに要する時間は 60 分以下とします。

例えば、お客さんの人数が 5 人で、各お客さんが要する時間が順に 2,6,4,3,9 分の場合、そのままの順序だと「待ち時間の合計」は 37 分になります。次の例では、最初の列の順の 2 人目と 3 人目を入れ替えています。この場合、「待ち時間の合計」は 35 分になります。最適な順序だと 31 分で済みます。

待ち時間

1 人目 2 分

0 分

2 人目 6 分

2 分

3 人目 4 分

8 分

4 人目 3 分

12 分

5 人目 9 分

15 分

37 分

← 「待ち時間の合計」

2 人目と 3 人目を入れ替えた例

待ち時間

1 人目 2 分

0 分

2 人目 4 分

2 分

3 人目 6 分

6 分

4 人目 3 分

12 分

5 人目 9 分

15 分

35 分

← 「待ち時間の合計」

Input

複数のデータセットが与えられます。各データセットは以下の形式で与えられます。

n
t1
t2
:
tn

1 行目にお客さんの人数 n (n ≤ 10,000) が与えられます。続く n 行に i 人目のお客さんが要する時間を表す整数 ti (0 ≤ ti ≤ 60) がそれぞれ１行に与えられます。

入力は１つの 0 を含む行で終わります。データセットの数は 50 を超えません。

Output

各データセットごとに、待ち時間の合計(整数)を１行に出力してください。

Sample Input

5
2
6
4
3
9
0

Output for the Sample Input

31


// 過去イチで酷い実装、いつかリファクタリングしたい
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;

        while ((line = br.readLine()) != null) {
            String[] input = line.split(" ");
            int p = Integer.parseInt(input[0]);
            int q = Integer.parseInt(input[1]);
            String qs = ""; // 商の羅列
            int[] rs = new int[81]; // 余りの羅列
            int pos = 0;
            StringBuilder second = new StringBuilder(); // 循環部を表示するため
            boolean isLoop = false;

            p -= (p / q) * q; // p < qにする
            rs[pos] = p;

            wh: while (true) {
                int sho = (10 * p) / q;
                p = (10 * p) % q;

                if (p == 0) {
                    qs = qs + sho;
                    break;
                }

                int i;
                for (i = pos; i >= 0; i--) {
                    if (rs[i] == p) {
                        qs = qs + sho;

                        int marklength = qs.length() - i;
                        for (int j = 0; j < i; j++) {
                            second.append(" ");
                        }
                        for (int j = 0; j < marklength; j++) {
                            second.append("^");
                        }
                        isLoop = true;
                        break wh;
                    }
                }

                qs = qs + sho;
                rs[++pos] = p;
            }

            if (isLoop) {
                System.out.println(qs);
                System.out.println(second.toString());
            } else {
                System.out.println(qs);
            }

        }
    }
}

循環小数

2 つの正の整数 p, q を入力し、 p / q を小数として正確に表現することを考えます。(ただし、0 < p < q < 106とします。)

このとき、結果は

有限の桁で正確に表現できる。

ある桁の範囲を繰り返す循環小数となる。

のいずれかとなります。筆算と同じ手順で1桁ずつ小数部を求めていくと、

割り切れた(余りが 0 になった)なら、そこまでの桁で正確に表現できた。

1度出てきた余りが、再び現れたなら、循環した。

と区別できます。

2 つの整数 p, q を入力すると、 p / q を小数で表した時の、小数部を出力するプログラムを作成してください。 ただし、

結果が有限の桁で正確に表現できる時は、数値だけを 1 行に出力してください。

結果が循環小数になる時は次のように 2 行に出力してください。

最初の行に、循環する部分までの数字を出力してください。

次の行には、循環しない部分の下には空白を出力し、循環する部分の下には「^」を出力してください。

いずれの場合も数字列は 80 文字を超えることはないものとします。

Input

入力は複数のデータセットからなります。各データセットとして、p, q が空白区切りで１行に与えられます。データセットの数は 250 を超えません。

Output

データセットごとに、循環しない小数の場合は数値の小数部分を(この場合 1 行)、循環小数の場合は循環するまでの数字と循環する部分を示す記号「^」(この場合 2 行) を出力してください。

Sample Input

1 12
10000 32768
1 11100
1 459550

Output for the Sample Input

083
^
30517578125
00009
^^^
00000217604178
^^^^^^^^^^^^


import java.util.Scanner;

public class Main {

	static char[][] table = new char[6][7];
	static{
		int cnt=0;
		for(int i = 1;i<7;i++){
			for(int j =1;j<6;j++){
				table[j][i]=(char)('a'+cnt++);
			}
		}
		table[2][6]='.';
		table[3][6]='?';
		table[4][6]='!';
		table[5][6]=' ';
	}
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		label:while(cin.hasNext()){
			String str = cin.next();
			if(str.length()%2!=0){
				System.out.println("NA");
				continue;
			}
			String ans = "";
			for(int i = 0;i<str.length();i+=2){
				int a = str.charAt(i)-'0';
				int b = str.charAt(i+1)-'0';
				//System.out.println(a + ""+ b);
				if(b < 1 || b > 5 || a < 1 || a > 6){
					System.out.println("NA");
					continue label;
				}
				else{
					ans += table[b][a];
				}
			}
			System.out.println(ans);
		}
	}

}

ポケベル打ち

ある日、たろう君は、本文に「519345213244」という数字だけが書いてあるおかしなメールを受け取り
ました。そのメールは、10 歳年上の従姉からだったので電話して聞いてみると、「あ、急いでたから
ポケベル打ちで送っちゃった。便利よね。よろしくねっ!」といって切られてしまいました。いつも
せわしなく、少し強引なところのあるこの従姉をよく知るたろう君は、仕方なく自分で「ポケベル打
ち」について調べてみると、10 年ぐらい前に一世を風靡したかな入力の方法だということが分かりまし
た。

「ポケベル打ち」では、図 1 のような変換表に従い‘あ’は 11、‘お’は 15 という具合に、2 つの数字
で一つの文字を入力していきます。例えば「なると」という文字列を入力するには「519345」と打ちま
す。従って、どの文字も 2 つの数字で入力することができるのです。

図1

携帯電話がまだ広く普及していないころ、高校生はこの方法で公衆電話から友達のポケベルにメッセー
ジを送信していたのだそうです。猛烈なスピードでポケベル打ちができる女子高生もいたとか。最近、
仕事も忙しくなってきた従姉は、メールを無意識のうちにポケベル打ちでタイプするようになってしま
いました。

そこで、毎回解読に苦労しているたろう君を助けるために、ポケベル打ちによるメッセージを文字列
に変換し出力するプログラムを作成してください。ただし、変換には図2の変換表を使い、英
小文字及び、「.」、「?」、「!」、空白のみを対象とします。変換出来ない文字を含むメッセージに対しては NA と出力してください。

図2

Input

複数のメッセージが与えられます。各行に１つのメッセージ (200 文字以内) が与えられます。メッセージの総数は 50 を超えません。

Output

各メッセージに対して、変換後のメッセージまたは NA を１行に出力してください。

Sample Input

341143514535
314
143565553551655311343411652235654535651124615163
551544654451431564
4
3411
6363636363
153414

Output for the Sample Input

naruto
NA
do you wanna go to aizu?
yes sure!
NA
na
?????
end


import java.util.Scanner;

class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int n = scan.nextInt();
		char[] a;
		int p;
		int s;
		int t;
		char[] m;

		while(n-- != 0){
			a = new char[3000];
			p = 1500;
			s = 1500;
			t = 1500;

			m = scan.next().toCharArray();
			a[p] = m[0];

			for(int i = 1; i < m.length;i ++){
				if(m[i] == '-')p++;
				else p--;
				i += 2;
				s = Math.min(s, p);
				t = Math.max(t, p);
				a[p] = m[i];
			}

			for(int i = s; i <= t; i++){
				System.out.print(a[i]);
			}
			System.out.println();
		}
	}
}

列車

26 両以下の編成の列車があります。それぞれの車両には、英小文字の a から z までの識別記号が付いています。同じ記号が付いている車両はありません。ただし、車両を連結する順番は自由とします。列車の中を車掌が巡回します。車掌は、列車の中を行ったり来たりして巡回するので、同じ車両を何度も通ることがあります。ただし、すべての車両を最低一回は巡回するものとします。また、巡回をはじめる車両や巡回を終える車両が列車の一番端の車両とは限りません。

ある車掌が乗ったすべての列車の巡回記録があります。そこから分かる各列車の編成を先頭車両から出力するプログラムを作成してください。巡回記録は 1 行が 1 つの列車に対応します。各行は、英小文字を 1 文字ずつ <- または -> で区切った文字列でできています。<- は前方の車両への移動、-> は後方の車両への移動を表します。

例えば、a->b<-a<-c は車両 a から後方の車両である b に移り、b から前方の a に移り、a から前方の c へ移ったことを表します。この場合の列車の編成は先頭車両から cab となります。

Input

１行目に巡回記録の個数 n (n ≤ 50)、続く n 行に巡回記録 i を表す文字列 si (1024文字までの半角文字列) が与えられます。

Output

巡回記録 i について、先頭車両からの列車の編成を現す文字列を i 行目に出力してください。

Sample Input

4
a->e->c->b->d
b<-c<-a<-d<-e
b->a->c<-a->c->d<-c<-a<-b->a->c->d->e<-d
a->e<-a<-d->a->e<-a<-d<-c->d->a<-d<-c<-b->c->d<-c

Output for the Sample Input

aecbd
edacb
bacde
bcdae


import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while(true){
			int n = sc.nextInt();
			if(n==0) break;
			int[][] mapV = new int[n+2][n+2];
			int[][] mapH = new int[n+2][n+2];
			int[][] mapRU = new int[n+2][n+2];
			int[][] mapRD = new int[n+2][n+2];

			String s = "";
			int max = 0;
			for(int i=1;i<=n;i++){
				s = sc.next();
				for(int j=1;j<=n;j++){
					if(s.codePointAt(j-1)==49){
						mapV[i][j] = mapV[i-1][j]+1;
						mapH[i][j] = mapH[i][j-1]+1;
						mapRU[i][j] = mapRU[i-1][j+1]+1;
						mapRD[i][j] = mapRD[i-1][j-1]+1;
						max = Math.max(Math.max(Math.max(Math.max(mapV[i][j], mapH[i][j]), mapRU[i][j]),mapRD[i][j]),max);
					}
				}
			}
			System.out.println(max);
		}
	}
}

Grid

There is a n × n grid D where each cell contains either 1 or 0.

Your task is to create a program that takes the gird data as input and computes the greatest number of consecutive 1s in either vertical, horizontal, or diagonal direction.

For example, the consecutive 1s with greatest number in the figure below is circled by the dashed-line.

The size of the grid n is an integer where 2 ≤ n ≤ 255.

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing one zero. Each dataset is formatted as follows:

n
D11 D12 ... D1n
D21 D22 ... D2n
.
.
Dn1 Dn2 ... Dnn

Output

For each dataset, print the greatest number of consecutive 1s.

Sample Input

5
00011
00101
01000
10101
00010
8
11000001
10110111
01100111
01111010
11111111
01011010
10100010
10000001
2
01
00
3
000
000
000
0

Output for the Sample Input

4
8
1
0


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n;
		while((n = sc.nextInt()) != 0){
			System.out.println(getCount(n));
		}
	}

	private static int getCount(int n){
		int count = 0;
		int num = n;
		while(num != 1){
			if(num % 2 == 0)	num /= 2;
			else		num = num * 3 + 1;
			count++;
		}
		return count;
	}
}

コラッツの予想

正の整数 n に対し、

n が偶数の時は 2 で割る。

n が奇数の時は 3 倍し、1 を足す。

という操作を繰り返すと結果が 1 になります。任意の正の整数 n に対してこの操作を繰り返すと必ず 1 になるであろうというのが「コラッツの予想」と呼ばれる問題です。この問題は日本では、「角谷の問題」としても知られている未解決の問題です。コンピュータを利用して非常に大きな数 3 × 253 = 27,021,597,764,222,976 以下については反例がないことが知られていますが、数学的には証明されていません。

整数 n を入力とし、結果が 1 になるまでに繰り返される操作の回数を出力するプログラムを作成してください。整数 n は 1 以上でかつ上記の計算を繰り返す途中の値が 1000000 以下となる程度の整数とします。たとえば、入力として 3 を受け取った場合は、操作列は

3 → 10 → 5 → 16 → 8 → 4 → 2 → 1

になるので、操作の回数（上の矢印の個数）である 7 を出力します。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットとして１つの整数 n (n ≤ 1000000) が１行に与えられます。

データセットの数は 50 を越えない。

Output

データセットごとに操作の回数を１行に出力します。

Sample Input

3
10
0

Output for the Sample Input

7
6


import java.util.Scanner;
class Main
{
    public static void main(String args[])
    {
	Scanner scan=new Scanner(System.in);
	while(true)
	    {
		int sum=0;
		int n=scan.nextInt();
		if(n==0)break;
		for(int i=0;i<n;i++)
		    {
			int x,y,h,w;
			x=scan.nextInt();
			y=scan.nextInt();
			h=scan.nextInt();
			w=scan.nextInt();
			if(x+y+h<=60)
			    {
				if(w<=2)sum+=600;
				else sum+=wcheck(w);
			    }
			else if(60<x+y+h && x+y+h<=80)
				{

				    if(w<=5)sum+=800;
				    else sum+=wcheck(w);
				}
			else if(80<x+y+h && x+y+h<=100)
				    {

					if(w<=10)sum+=1000;
					else sum+=wcheck(w);
				    }
			else if(100<x+y+h && x+y+h<=120)
				    {

					if(w<=15)sum+=1200;
					else sum+=wcheck(w);
				    }
			else if(120<x+y+h && x+y+h<=140)
				    {

					if(w<=20)sum+=1400;
					else sum+=wcheck(w);
				    }
			else if(140<x+y+h && x+y+h<=160)
				    {

					if(w<=25)sum+=1600;

				    }

		    }
		System.out.println(sum);
	    }
    }
	private static int wcheck(int g)
	{
	    if(g<=2)
		{
		    return 600;
		}
	    else if(2<g && g<=5)
		{
		    return 800;
		}
	    else if(5<g && g<=10)
		{
		    return 1000;
		}
	    else if(10<g && g<=15)
		{
		    return 1200;
		}
	    else if(15<g && g<=20)
		{
		    return 1400;
		}
	    else if(20<g && g<=25)
		{
		    return 1600;
		}
	    return 0;
	}

}

宅配料金

ある宅配業者の宅配料金は大きさと重量で下表のように料金が設定されています。

A サイズ

B サイズ

C サイズ

D サイズ

E サイズ

F サイズ

大きさ

60cm以内

80cm以内

100cm以内

120cm以内

140cm以内

160cm以内

重さ

2kg以内

5kg以内

10kg以内

15kg以内

20kg以内

25kg以内

料金

600円

800円

1000円

1200円

1400円

1600円

大きさは三辺（縦、横、高さ）の和です。例えば大きさが120cmで、重さが15kg以内の荷物はＤサイズ（1,200円）となります。大きさが120cm以内でも、重さが15kgを超え、20kg以内ならばＥサイズとなります。

1日に持ち込まれた荷物の情報を入力とし、料金の総計を出力するプログラムを作成してください。なお、Ｆサイズを超えた荷物は対象外とし料金の総計には含みません。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
x1 y1 h1 w1
x2 y2 h2 w2
:
xn yn hn wn

１行目に荷物の個数n (1 ≤ n ≤ 10000)、続くn 行に i 番目の荷物の縦の長さ xi、横の長さ yi、高さ hi、重さ wi (1 ≤ xi, yi, hi, wi ≤ 200) が空白区切りで１行に与えられます。

データセットの数は 20 を超えません。

Output

データセットごとに荷物の料金の総計を１行に出力します。

Sample Input

2
50 25 5 5
80 60 10 30
3
10 15 25 24
5 8 12 5
30 30 30 18
0

Output for the Sample Input

800
3800


import java.util.*;
public class Main {
	static int h;
	static int w;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true) {
			w = sc.nextInt();
			h = sc.nextInt();
			if(w == 0 && h == 0) break;
			char[][] map;
			boolean[][] alMove;
			map = new char[h][w];
			alMove = new boolean[h][w];
			for(int i = 0; i < h; i++) {
				map[i] = sc.next().toCharArray();
			}
			int i = 0;
			for(i = 0; i <= 180; i++) {
				boolean check = false;
				for(int j = 0; j < h; j++) {
					for(int k = 0; k < w; k++) {
						if(map[j][k] == 'E') {
							check = true;
							if     (rcheck(j+1,k) && (map[j+1][k] == '.' || map[j+1][k] == 'X')) {
								map[j][k] = 'S';
							}
							else if(rcheck(j,k+1) && (map[j][k+1] == '.' || map[j][k+1] == 'X')) {
								map[j][k] = 'E';
							}
							else if(rcheck(j-1,k) && (map[j-1][k] == '.' || map[j-1][k] == 'X')) {
								map[j][k] = 'N';
							}
							else if(rcheck(j,k-1) && (map[j][k-1] == '.' || map[j][k-1] == 'X')) {
								map[j][k] = 'W';
							}
						}
						else if(map[j][k] == 'N') {
							check = true;
							if     (rcheck(j,k+1) && (map[j][k+1] == '.' || map[j][k+1] == 'X')) {
								map[j][k] = 'E';
							}
							else if(rcheck(j-1,k) && (map[j-1][k] == '.' || map[j-1][k] == 'X')) {
								map[j][k] = 'N';
							}
							else if(rcheck(j,k-1) && (map[j][k-1] == '.' || map[j][k-1] == 'X')) {
								map[j][k] = 'W';
							}
							else if(rcheck(j+1,k) && (map[j+1][k] == '.' || map[j+1][k] == 'X')) {
								map[j][k] = 'S';
							}

						}
						else if(map[j][k] == 'W') {
							check = true;
							if     (rcheck(j-1,k) && (map[j-1][k] == '.' || map[j-1][k] == 'X')) {
								map[j][k] = 'N';
							}
							else if(rcheck(j,k-1) && (map[j][k-1] == '.' || map[j][k-1] == 'X')) {
								map[j][k] = 'W';
							}
							else if(rcheck(j+1,k) && (map[j+1][k] == '.' || map[j+1][k] == 'X')) {
								map[j][k] = 'S';
							}
							else if(rcheck(j,k+1) && (map[j][k+1] == '.' || map[j][k+1] == 'X')) {
								map[j][k] = 'E';
							}
						}
						else if(map[j][k] == 'S') {
							check = true;
							if     (rcheck(j,k-1) && (map[j][k-1] == '.' || map[j][k-1] == 'X')) {
								map[j][k] = 'W';
							}
							else if(rcheck(j+1,k) && (map[j+1][k] == '.' || map[j+1][k] == 'X')) {
								map[j][k] = 'S';
							}
							else if(rcheck(j,k+1) && (map[j][k+1] == '.' || map[j][k+1] == 'X')) {
								map[j][k] = 'E';
							}
							else if(rcheck(j-1,k) && (map[j-1][k] == '.' || map[j-1][k] == 'X')) {
								map[j][k] = 'N';
							}
						}
					}
				}
				if(!check) break;
				for(int j = 0; j < h; j++) {
					Arrays.fill(alMove[j], false);
				}
				for(int j = 0; j < h; j++) {
					IN:for(int k = 0; k < w; k++) {
						if(map[j][k] != '.' && map[j][k] != 'X') continue;
						if(map[j][k] == '.') {
							if    (rcheck(j,k+1) && !alMove[j][k] && !alMove[j][k+1] && map[j][k+1] == 'W') {
								map[j][k+1] = '.';
								map[j][k] = 'W';
								alMove[j][k] = true;
								alMove[j][k+1] = true;
								continue IN;
							}
							else if    (rcheck(j-1,k) && !alMove[j][k] && !alMove[j-1][k] && map[j-1][k] == 'S') {
								map[j-1][k] = '.';
								map[j][k] = 'S';
								alMove[j][k] = true;
								alMove[j-1][k] = true;
								continue IN;
							}
							else if    (rcheck(j,k-1) && !alMove[j][k] && !alMove[j][k-1] && map[j][k-1] == 'E') {
								map[j][k-1] = '.';
								map[j][k] = 'E';
								alMove[j][k] = true;
								alMove[j][k-1] = true;
								continue IN;
							}
							else if    (rcheck(j+1,k) && !alMove[j][k] && !alMove[j+1][k] && map[j+1][k] == 'N') {
								map[j+1][k] = '.';
								map[j][k] = 'N';
								alMove[j][k] = true;
								alMove[j+1][k] = true;
								continue IN;
							}
						}
						else if(map[j][k] == 'X') {
							if(rcheck(j,k+1) && map[j][k+1] == 'W' && !alMove[j][k] && !alMove[j][k+1]) {
								map[j][k+1] = '.';
								alMove[j][k] = true;
								alMove[j][k+1] = true;
								continue IN;
							}
							else if(rcheck(j-1,k) && map[j-1][k] == 'S' && !alMove[j][k] && !alMove[j-1][k]) {
								map[j-1][k] = '.';
								alMove[j][k] = true;
								alMove[j-1][k] = true;
								continue IN;
							}
							else if(rcheck(j,k-1) && map[j][k-1] == 'E' && !alMove[j][k] && !alMove[j][k-1]) {
								map[j][k-1] = '.';
								alMove[j][k] = true;
								alMove[j][k-1] = true;
								continue IN;
							}
							else if(rcheck(j+1,k) && map[j+1][k] == 'N' && !alMove[j][k] && !alMove[j+1][k]) {
								map[j+1][k] = '.';
								alMove[j][k] = true;
								alMove[j+1][k] = true;
								continue IN;
							}
						}
					}
				}
			}
			if(i <=  180) {
				System.out.println(i);
			}
			else {
				System.out.println("NA");
			}
		}
	}

	public static boolean rcheck(int a, int b) {
		if(a < 0 || b < 0 || a >= h || b >= w) return false;
		return true;
	}
}

ザ・スクエアーズ

この度、有名なテーマパークに、巨大迷路ザ・スクエアーズが新しく完成しました。 消防署の指導により避難訓練をしなければなりませんが、巨大迷路なだけに訓練にかかる時間を予測することができません。そこで、あなたは以下の仕様をもとに避難訓練シミュレータを開発することになりました。

巨大迷路は図 1 に示すように、横 W 、縦 H の W × H 個のマス目で表わされます。各マス目は、通路(白いマス目)、壁(茶色いマス目) 、非常口(緑のマス目)のいずれかです。図中の○は人を表し、その中の英小文字(E、W、S、N)はその人が向いている方角(東西南北)を表しています。図は上方向が北になるように描かれています。

図1

巨大迷路内にいる人は最初、東西南北のいずれかの方向を向いて立っています。各人は 1 秒単位で同時に次に示す手順で移動を試みます。

現在向いている方向の、右、前、左、後のマス目を順番に調べ、最初に見つけた、空いている通路または非常口の方向に向きを変えます。そのようなマス目が無い場合は向きを変えません。

目の前のマス目が空いていて、他の人の目の前のマス目になっていない場合は移動します。同じマス目を目の前のマスとする人が複数いる場合は、そのマス目の、東、北、西、南のマス目にいる人の順で選択された 1 人が移動します。

移動後に非常口に到着した人は、無事避難し迷路内から消えます。

与えられた巨大迷路と人の位置情報を入力とし、全ての人が避難し終える時間を出力するプログラムを作成してください。 脱出に 180 秒より長い時間を要する場合は NA と出力して下さい。 迷路と人の位置情報は、 H 行 W 列の文字によって与えられます。各文字の意味は以下のとおりです。

# : 壁

. : 床

X : 非常口

E : 東を向いている人

N : 北を向いている人

W : 西を向いている人

S : 南を向いている人

なお、迷路と外部との境界は壁 # または非常口 X のいずれかです。また、巨大迷路の中には、人が必ず１人以上います。

Input

複数のデータセットの並びが入力として与えられます。 入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

W H
str1
str2
:
strH

1 行目に迷路の横方向の大きさ W、縦方向の大きさ H (1 ≤ W, H ≤ 30) が与えられます。続く H 行に迷路の i 行目を表す文字列 stri (長さ W) が与えられます。

データセットの数は 50 を超えません。

Output

入力データセットごとに、全ての人が避難し終える時間を１行に出力します。

Sample Input

10 3
##########
#E.......X
##########
4 4
####
#N.#
#..X
####
5 5
#####
#N..#
###.X
#S..#
#####
6 6
######
#..#X#
#.EE.#
####N#
#....#
######
8 8
##X#####
#....E.#
#####.##
#.#...##
#.W.#..#
#.#.N#.X
#X##.#.#
########
0 0

Output for the Sample Input

8
NA
9
16
10


import java.awt.Point;
import java.util.Scanner;

public class Main {

	/** ????§??????? */
	static final String WHITE_SPACE = " ";

	/** ??????????????????_X */
	static int mapSizeX = 0;

	/** ??????????????????_Y */
	static int mapSizeY = 0;

	/** ??????????????° */
	static int maxNode = 0;

	/** ????????? */
	//	static String[] map = new String[1000 * 1000];

	/** ????????¢??????????????? */
	/** ????????? */
	//	static List<Point> pachimonList = new ArrayList<Point>();
	//	static Point[] pachimonList = new Point[1000 * 1000];

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNextLine()) {
			readMap(scanner);
		}

	}

	/**
	 * ?????????????????????????????????
	 * @param scanner ????????£??????
	 */
	private static void readMap(Scanner scanner) {
		String[] mapSizeLine = scanner.nextLine().split(WHITE_SPACE);
		if (mapSizeLine.length < 2) {
			return;
		}

		// ??????????????±????????????
		//		pachimonList.removeAll(pachimonList);
		maxNode = 0;
		//		mapSizeX = Integer.parseInt(mapSizeLine[0]);
		//		mapSizeY = Integer.parseInt(mapSizeLine[1]);
		//		initializeMap(mapSizeX, mapSizeY);

		for (int i = 0; i < mapSizeY; i++) {
			String mapInfoLine = scanner.nextLine();
			//				mapInfoLine = mapInfoLine.replaceAll(".", "9");
			//				mapInfoLine = mapInfoLine.replaceAll("S", "0");
			//				mapInfoLine = mapInfoLine.replaceAll("G", "6");
			for (int j = 0; j < mapSizeX; j++) {
				//					int val = Integer.valueOf(mapInfoLine.charAt(j));
				//					if (val < 9) {
				//						// ???????????¢????????°????¨????
				////						pachimonList[maxNode] = createPos(Integer.valueOf(val), calcIndex(j, i));
				//						maxNode++;
				//					}
			}
		}

		//		Collections.sort(pachimonList, new Comparator<Point>() {
		//			@Override
		//			public int compare(Point o1, Point o2) {
		//				return o1.x - o2.x;
		//			}
		//		});
	}

	//	/**
	//	 * ??????????????¨??????????´???????????????§?????????
	//	 */
	//	private static void initializeMap(int sizeX, int sizeY) {
	//		for (int i = 0; i < sizeX * sizeY; i++) {
	//			map[i] = "";
	//		}
	//	}

	/**
	 * X????????????????????´?????????????????¢???????±???§????¨????

	 * ????????????:0?????´??????:6???????????¢???????±???§:1???5

	 * Y????????????????????????????????????????´?
	 * @param type ?????????????????´?????????????????¢???????±???§
	 * @param index ??????????????????????????????
	 * @return
	 */
	private static Point createPos(int type, int index) {
		return new Point(type, index);
	}

	/**
	 * X??§?¨???¨Y??§?¨???????????????£?????????????????????????????????????????´?????????
	 *
	 * @param x X??§?¨?
	 * @param y Y??§?¨?
	 * @return
	 */
	private static int calcIndex(int x, int y) {
		return x * mapSizeY + y;
	}
}

パチモンクリーチャー

某国で大人気のゲーム、パチモンクリーチャーが日本でリメイクされて発売されました。 ゲームが大好きなあなたは、 このゲームを何度もプレイするうちにどうしたら最速でクリアできるのか考えるようになりました。しかし、いくら考えても最速の攻略方法がわからなかったあなたは、どれだけ早くゲームをクリアできるかを求めるプログラムを作成することにしました。

ゲームの詳細は以下の通りです。

パチモンクリーチャー(以下、パチクリ)という生物が多く存在する世界がゲームの舞台です。各パチクリは、火属性、氷属性、木属性、土属性、水属性の 5 種類の属性のいずれか１つの属性を持ちます。ゲームの主人公は、ゲーム開始時に好きな属性のパチクリ一匹を冒険のパートナーとして選びます。そのパチクリと共にゴールを目指し、ゴールにいるライバルを倒してパチクリマスターになることがゲームの目的です。

しかし、ライバルを倒すためには全属性のパチクリがいないと勝てないので、途中で全属性のパチクリを捕まえなければなりません。パチクリを捕まえるには属性がカギとなります。火属性のパチクリは氷属性のパチクリを捕まえることができ、同様に、氷属性は木属性、木属性は土属性、土属性は水属性、水属性は火属性を捕まえることができます。属性の関連は以下の図のようになります。

以下の図はゲームが行われるマップの一例を表しています。

主人公はパチクリを一匹もってスタート地点である「S」から出発し、一マスずつ移動しながらゴール地点である「G」を目指します。その途中で、最初に持っているパチクリ以外の 4 つの属性のパチクリを捕まえ、ゴール地点であるマス目に移動するとゲーム終了となります。

主人公は、今いるマス目から、辺を共有する隣のマス目に移動することができ、それを一回の移動と数えます。主人公がパチクリのいるマスに移動した場合、そのパチクリを捕まえられる属性のパチクリを持っていればそのパチクリを捕まえたことになります。そのマスにいるパチクリを捕まえられるかの可否にかかわらず、すべてのマスに何度でも移動することができます。

マップの大きさ(横方向の列数、縦方向の行数)とマップの初期状態を入力とし、初めに選んだパチクリの属性と、それ以外の 4 つの属性のパチクリを捕まえるのにかかる、スタート地点からゴール地点に至る最小移動数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終りはゼロふたつの行で示されます。各データセットは以下の形式で与えられます。

W H
c11c12...c1W
c21c22...c2W
:
cH1cH2...cHW

1 行目にマップの横方向の列数 W と縦方向の行数 H (2 ≤ W, H ≤ 1000) が与えられます。続く H 行にマップの i 行目の情報が与えられます。入力されるマップには各マスの状態が与えられます。 「S」は主人公のスタート地点を、 「G」はゴール地点を、「1」「2」「3」「4」「5」はそこにいるパチクリの属性を( 1:火属性、 2:氷属性、 3:木属性、 4:土属性、 5:水属性 をそれぞれ表します)、 「.(ピリオド) 」は何もないマスをそれぞれ表します。
各属性のパチクリの数はそれぞれ 0 以上 1000 以下とします。

データセットの数は140 を超えません。また、データセットの 80 % について、W, H は100 を超えません。

Output

入力データセットごとに、最初に選んだパチクリの属性と最小移動数を１行に出力します。なお、どのように初めのパチクリを選んでも、どのような経路で移動してもそれら 4 つの属性のパチクリを捕まえることができない場合は NA と出力してください。 また、最小移動数が同じになるような最初のパチクリの選び方が複数ある場合は、属性の数字が小さいものを出力してください。

Sample Input

6 6
S.1..4
3..5..
..4.1.
4....5
.2.32.
5.1..G
3 2
...
S.G
0 0

Output for the Sample Input

2 10
NA


//Cutting Down Water Bills
import java.io.IOException;
import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {

		Scanner scan =new Scanner(System.in);

		int n;
	      while ((n = scan.nextInt())!=-1) {

			int p;
			if(n<=10){
				p=1150;
			}else if(n<=20){
				p=1150+(n-10)*125;
			}else if(n<=30){
				p=2400+(n-20)*140;
			}else{
				p=3800+(n-30)*160;
			}

			 System.out.println(4280-p);

		}

	}
}

水道料金

松平さんは、普段からエコに気を付けて生活をしています。先月の水道料金が 4280 円となり、いつも目標としている 4000 円を超えてしまったので、今月は節水に努めてきました。先月と比べて水道料金はどのくらい節約できたのでしょうか。

今月の使用水量 w [m3] を入力とし、先月の水道料金である 4280 円と比較して、どのくらい水道料金を節約できたかを出力するプログラムを作成してください。

なお、水道料金は次のように計算されます。

(水道料金) = (基本料金) + (水量による料金)

水量による料金は下表のように使用量に応じて計算されます。

段階

水量

料金

第 1 段階料金

10 [m3] まで

基本料金 1150 円

第 2 段階料金

10 [m3] 超過 20 [m3] まで

1 [m3] あたり 125 円

第 3 段階料金

20 [m3] 超過 30 [m3] まで

1 [m3] あたり 140 円

第 4 段階料金

30 [m3] 超過分

1 [m3] あたり 160 円

例えば、使用水量 40 [m3] の場合は、
基本料金 1150 円(第 1 段階) + 10 [m3] × 125 円(第 2 段階) + 10 [m3] × 140 円(第 3 段階) + 10 [m3] × 160 円(第 4 段階) = 5400 円

となります。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりは -1 ひとつの行で示されます。

各データセットとして、 今月の使用水量を表す整数 w (0 ≤ w ≤ 100) が１行に与えられます。

データセットの数は 200 を超えません。

Output

入力データセットごとに、先月の水道料金との差を1行に出力します。

Sample Input

29
40
0
-1

Output for the Sample Input

620
-1120
3130


import java.util.Scanner;

class Main {

	public static void main(String[] args) throws java.io.IOException {

		Scanner scan = new Scanner(System.in);

		int n;
		while ((n = scan.nextInt()) != -1) {

			int p;
			if (n <= 10) {
				p = 1150;
			} else if (n <= 20) {
				p = 1150 + (n - 10) * 125;
			} else if (n <= 30) {
				p = 2400 + (n - 20) * 140;
			} else {
				p = 3800 + (n - 30) * 160;
			}

			System.out.println(4280 - p);

		}

	}
}


import java.io.*;
import java.math.BigDecimal;
import java.util.*;

// 2011/10/22

//0216@¹¿à
public class Main {

	// C return falseÅ¨µÜ¢
	boolean main() throws IOException {

		int[] ir = readIntArray();
		int w = ir[0];
		if (w == -1)
			return false;

		int r;
		if (w > 30) {
			r = 1150 + 1250 + 1400+ (w-30)*160;
		}
		else if (w > 20) {
			r = 1150 + 1250 + (w-20)*140;
		}
		else if (w > 10) {
			r = 1150 + (w-10)*125;
		}
		else {
			r = 1150;
		}

		// ðÌ\¦
		System.out.printf("%d\n", 4280 - r);

		return true; // ³íI¹ Ö
	}

//	private final static boolean DEBUG = true;  // debug
	private final static boolean DEBUG = false; // release

	public static void main(String[] args) throws IOException {

		if (DEBUG) {
			log = System.out;

			String inputStr = "29:0:";

			inputStr = inputStr.replace(":", "\n");

			reader = new BufferedReader(new StringReader(inputStr));

		}
		else {
			log = new PrintStream(new OutputStream() { public void write(int b) {} } ); // «ÌÄ
			reader = new BufferedReader(new InputStreamReader(System.in)); // R\[©ç
		}

		//int N = readIntArray()[0];

		for(int i = 0; /*i < N*/; i++) {
			boolean b = new Main().main();
			if (!b)
				break;
		}

		reader.close();
	}

	static PrintStream log;
	static BufferedReader reader;

	// WüÍæè1sªÌXy[XæØèÌ®lðÇÞ
	// EOFÌêÍnullðÔ·
	private static int[] readIntArray() throws IOException {

		String s = reader.readLine();
		if (s == null)
			return null;
		String[] sp = s.split(" ");
		int[] a = new int[sp.length];
		for(int i = 0; i < sp.length; i++) {
			a[i] = Integer.parseInt(sp[i]);
		}
		return a;
	}

}


import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int c;
        int[] ice = new int[10];
        for(int i=0;i<n;i++){
            c = sc.nextInt();
            ice[c]++;
            if(c==0) break;
        }
        for(int i=0;i<10;i++){
            if(ice[i]==0){System.out.print("-");}
            else{
                for(int j=0;j<ice[i];j++){
                    System.out.print("*");
                }
            }
            System.out.println("");
        }
    }
}

ヒストグラム

テンアイスクリームという名前のアイスクリーム屋さんがあります。このお店では常に 10 種類のアイスクリームが店頭に並ぶようにしています。お店の店長は商品開発の参考にするために、アイスクリームの売れ具合を表すグラフを毎日作成しています。

そんな店長のために、あなたは各アイスクリームの販売数をグラフで表示するプログラムを作成することになりました。

一日に販売されるアイスクリームの総数と売れたアイスクリームの番号を入力とし、アイスクリームの種類ごとに販売した数だけ * (半角アスタリスク) を出力するプログラムを作成してください。ただし、アイスクリームの種類を 0 から 9 までの整数で表わします。また、販売個数がゼロのアイスクリームは、- (半角ハイフン) をひとつ出力します。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
c1
c2
:
cn

1 行目に一日に販売されるアイスクリームの総数 n (1 ≤ n ≤ 10000) が与えられます。続く n 行に第 i のアイスクリームの種類 ci (0 ≤ ci≤ 9) が与えられます。

データセットの数は 20 を超えません。

Output

入力データセットごとに、各アイスクリームの種類の番号順に販売数を出力します。

Sample Input

15
2
6
7
0
1
9
8
7
3
8
9
4
8
2
2
3
9
1
5
0

Output for the Sample Input

*
*
***
*
*
-
*
**
***
**
-
*
-
-
-
*
-
-
-
*


import java.util.*;

public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int INF = Integer.MAX_VALUE;

		while(true){
			int m = sc.nextInt();
			int n = sc.nextInt();
			int k = sc.nextInt();
			int d = sc.nextInt();
			if(m == 0) break;

			int[] cake = new int[m];
			for(int i=0;i<m;i++)
				cake[i] = sc.nextInt();

			//[0]:X^[g
			//[1]~[m]:P[L®
			//[m+1]~[m+n]:h}[N
			//[m+n+1]:sð
			int[][] map = new int[m+n+2][m+n+2];
			for(int[] tmp : map) Arrays.fill(tmp,INF);

			for(int i=0;i<d;i++){
				String a = sc.next();
				String b = sc.next();
				int cost = sc.nextInt();
				int from=-1,to=-1;

				if(a.equals("H")) from = 0;
				else if(a.equals("D")) from = m+n+1;
				else if(a.charAt(0) == 'C') from = Integer.parseInt(a.substring(1));
				else from = m + Integer.parseInt(a.substring(1));

				if(b.equals("H")) to = 0;
				else if(b.equals("D")) to = m+n+1;
				else if(b.charAt(0) == 'C') to = Integer.parseInt(b.substring(1));
				else to = m + Integer.parseInt(b.substring(1));

				map[from][to] = map[to][from] = k * cost;
			}

			PriorityQueue<State> open = new PriorityQueue<State>();
			int[][] closed = new int[m+n+4][1000];
			for(int[] tmp : closed) Arrays.fill(tmp,INF);
			int ans = INF;
			open.add(new State(0,0,0));

			while(!open.isEmpty()){
				State st = open.poll();
				if(closed[st.id][st.used] <= st.cost) continue;
				closed[st.id][st.used] = st.cost;

				if(st.id == m+n+1){
					ans = Math.min(ans,st.cost);
				}

				for(int i=0;i<m+n+2;i++){
					if(map[st.id][i] != INF && ( i<1 || m<i || (st.used & (1<<i)) == 0 ) ){
						int ncost = st.cost + map[st.id][i];
						int nused = st.used;
						if(1 <= i && i <= m){
							ncost -= cake[i-1];
							nused |= (1<<i);
						}
						if(closed[i][nused] > ncost)
							open.add(new State(ncost,i,nused));
					}
				}
			}

			System.out.println(ans);
		}
	}
}

class State implements Comparable<State>{
	int cost,id,used;

	State(int cost,int id,int used){
		this.cost = cost;
		this.id = id;
		this.used = used;
	}

	public int compareTo(State st){
		return this.cost - st.cost;
	}
}

自転車でダイエット

A さんは甘いものが大好きですが、最近は奥さんからダイエットするように言われています。ある日、A さんが自宅から市役所に出かけるとき、奥さんは自転車で行くことを勧めました。そこでA さんはしぶしぶ自転車に乗って出かけましたが、甘い物の好きな A さんは、途中にあるケーキ屋さんに立ち寄りケーキの食べ歩きをしようと思いつきました。

自転車をこげば走行距離に応じてカロリーが消費されますが、ケーキを食べればその分カロリーが摂取されます。正味の消費カロリーは、自転車をこいで消費したカロリーからケーキを食べて摂取したカロリーを引いた値になります。したがって、正味の消費カロリーが 0 より小さくなることもあります。

ケーキ屋さんでケーキを買ったら、 Aさんはその場でケーキを全部食べてしまいます。 Aさんがすべてのケーキ屋さんに立ち寄るとは限りませんが、ケーキ屋さんが存在する地点を通るときには、必ず立ち寄ってケーキを 1 つ買って食べるものとします。ただし、同じケーキ屋さんの前を何度も通るのはさすがに気がひけるので、各ケーキ屋さんに訪れられるのは 1 回だけとします。また、目的地の市役所をいったん通り過ぎてからケーキ屋さんに立ち寄り、その後で市役所に戻って用を済ませてもよいものとし、ケーキ屋さん以外は何度訪れても良いものとします。

A さんの自宅から市役所までの地図情報と、その途中にあるケーキ屋さんで食べられるケーキのカロリーの一覧、単位距離の走行による消費カロリーを入力とし、自宅を出発してから市役所に入るまでの正味の消費カロリーの最小値を出力するプログラムを作成してください。

地図には、A さんの自宅と市役所、ケーキ屋さんとランドマーク(目印)になる建物が書かれています。地図を表す入力データは、A さんの自宅、市役所、ケーキ屋さんとランドマークの各地点の間をつなぐ道があるとき、2 つの地点を表す記号とその間の距離からなる行を含みます。たとえば、5 番目のケーキ屋さんと 3 番目のランドマークの間の距離が 10 なら、入力データは以下のような行を含みます。

C5 L3 10

このようにケーキ屋さんには C、ランドマークには L を番号の前につけて表します。また、A さんの自宅は H、市役所は D で表します。入力データに 2 つの地点とその間の距離が与えられているなら、2 地点の間をどちら向きにも進めます。たとえば、上の例ではケーキ屋さんからランドマークへも、その逆向きへも進むことができます。また、自宅から市役所までは必ずたどり着けるものとします。それ以外に与えられる入力データは、ケーキ屋さんの数 m、ランドマークの数 n、単位距離あたりの消費カロリー k、 1 番目のケーキ屋さんから m 番目のケーキ屋さんまでのそれぞれで買えるケーキのカロリーを表す m 個のデータ、距離のデータの総数 d です。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりは四つの 0 の行で示されます。
各データセットは以下の形式で与えられます。

m n k d
c1 c2 ... cm
s1 t1 e1
s2 t2 e2
:
sd td ed

1 行目にケーキ屋さんの数 m (1 ≤ m ≤ 6)、 ランドマークの数 n (1 ≤ n ≤ 100) 、単位距離あたりの消費カロリー k (1 ≤ k ≤ 5)、距離のデータの総数 d (5 ≤ d ≤ 256) が与えられます。

2 行目に各ケーキ屋で買うケーキのカロリー ci (1 ≤ ci ≤ 100) が与えられます。

続く d 行に i 番目の 2 つの地点間の距離データ si, ti, ei (1 ≤ ei ≤ 20) が与えられます。

データセットの数は 100 を超えません。

Output

入力データセットごとに、全体の消費カロリーの最小値を１行に出力します。

Sample Input

1 1 2 5
35
H L1 5
C1 D 6
C1 H 12
L1 D 10
C1 L1 20
2 1 4 6
100 70
H L1 5
C1 L1 12
C1 D 11
C2 L1 7
C2 D 15
L1 D 8
0 0 0 0

Output for the Sample Input

1
-2