ABC246A～Cの解答[Java]

## はじめに
提出時のコードの入力受け取りのみ書き換えてあります。

では、見ていきましょう

## A - Four Points
問題文は[こちら](https://atcoder.jp/contests/abc246/tasks/abc246_a)

長方形なので、(x1,y1)、(x1,y2)、(x2,y2)、(x2,y1)の四点で構成されています。
したがって、x座標、y座標それぞれを比較して、ペアになっていない値を出力すれば良いです。
```A.java
import java.util.*;
class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);

		//それぞれの座標を記録する
		int[] xy1 = {sc.nextInt(),sc.nextInt()};
		int[] xy2 = {sc.nextInt(),sc.nextInt()};
		int[] xy3 = {sc.nextInt(),sc.nextInt()};

		//一つだけ座標が違うはずなので、それを探して出力
		if(xy1[0]==xy2[0])
			System.out.print(xy3[0]+" ");
		else if(xy1[0]==xy3[0])
			System.out.print(xy2[0]+" ");
		else
			System.out.print(xy1[0]+" ");

		//y座標も同様に
		if(xy1[1]==xy2[1])
			System.out.print(xy3[1]);
		else if(xy1[1]==xy3[1])
			System.out.print(xy2[1]);
		else
			System.out.print(xy1[1]);
		System.out.println();
	}
}
```
まぁ、いわゆるやるだけですね。

## B - Get Closer
問題文は[こちら](https://atcoder.jp/contests/abc246/tasks/abc246_b)

(0,0)から(A,B)の方向に1進んだ時の座標(x,y)は以下のように表せます。

$(x,y) = (cosθ,sinθ) = (\frac{A}{\sqrt{A^2+B^2}},\frac{B}{\sqrt{A^2+B^2}})$

あとはこれを実装するだけです。
```B.java
import java.util.*;
class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);

		//A、Bの取得
		int A = sc.nextInt();
		int B = sc.nextInt();

		//式の実装
		System.out.println(A/Math.sqrt(A*A+B*B)+" "+B/Math.sqrt(A*A+B*B));
	}
}
```
これもまぁ易しい方ですね。

## C - Coupon
問題文は[こちら](https://atcoder.jp/contests/abc246/tasks/abc246_c)

まず、それぞれの商品に対して0円になる直前までクーポンを使った場合を調べます。
このとき、使用する必要があるクーポンの枚数がK枚を超えている場合は商品の総額-N*Kが解となります(Kの割引分を無駄にすることなくフルで使える場合なので)。
K枚を超えていない場合は残りの金額をソートして一番高い商品から順に使っていけば答えが求まります。
```C.java
import java.util.*;
class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);

		//N、K、X、Aを取得
		int N = sc.nextInt();
		int K = sc.nextInt();
		int X = sc.nextInt();
		int[] A = new int[N];
		for(int i=0;i<N;i++)A[i] = sc.nextInt();

		//使用したクーポンの枚数、合計金額、クーポンを使った後の金額を記録する変数
		long coupon = 0;
		long sum = 0;
		long answer = 0;

		//0かその直前までクーポンを使ってみる
		for(int i=0;i<A.length;i++){
			sum += A[i];
			coupon += A[i] / X;
			answer += A[i] %= X;
		}

		//枚数を超えてしまっている？
		if(coupon>=K){
			System.out.println(sum-(long)K*X);
			System.exit(0);
		}

		//クーポンの枚数がすんごい多い？
		if(K-coupon>=A.length){
			System.out.println(0);
			System.exit(0);
		}

		//地道に調べるしかない場合はソートして、最高金額からクーポンを使っていく
		Arrays.sort(A);
		for(int i=0;i<K-coupon;i++){
			answer -= A[A.length-1-i];
		}
		System.out.println(answer);
	}
}
```
コンテスト後ではありますが、自力で自分解けたんですよね。今コンテストで出たらちょっと不安…。

## 感想
A:やるだけ。
B:解き方さえ思いつけばなんてことはない。
C:実際に試行してみれば解法が思いつきそう。ちょっと不安だけど。
って感じでした。

Dも含めて、なんとなく数学よりの問題ですね。Dも解けたら追記します。

## 追記(D - 2-variable Function)
問題文は[こちら](https://atcoder.jp/contests/abc246/tasks/abc246_d)

[公式解説](https://atcoder.jp/contests/abc246/editorial/3701)通りの考え方です。
bに対して、X≧Nとなる最小のaを順に探す、という手法です。

```D.java
class Main{
	public static void main(String[] args){

		//Nの取得(どうせNだけなのでオブジェクトは破棄)
		long N = new java.util.Scanner(System.in).nextLong();

		//a、bの初期値を設定
		long b = (long)1e6;
		long a = 0;

		//答えは最小値を求めるので最高値を初期値として格納
		long answer = Long.MAX_VALUE;

		//aとbの大小が逆転するまで繰り返す
		while(a<=b){

			//Xを求める
			long temp = a*a*a+a*a*b+a*b*b+b*b*b;

			//N≧Xか？
			if(N<=temp){

				//bを1小さくしてもう一度ループ
				b--;
				answer = Math.min(answer,temp);
				continue;
			}

			//a側を徐々に大きくしていく
			a++;
		}

		//最小のXを出力
		System.out.println(answer);
	}
}
```
いざ実装してみるとすんごい簡単でした。もっと早く気付きたかったな･･･。