LoginSignup
0
0

More than 1 year has passed since last update.

ABC246A~Cの解答[Java]

Last updated at Posted at 2022-07-28

はじめに

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

では、見ていきましょう

A - Four Points

問題文はこちら

長方形なので、(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

問題文はこちら

(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

問題文はこちら

まず、それぞれの商品に対して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)

問題文はこちら

公式解説通りの考え方です。
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);
	}
}

いざ実装してみるとすんごい簡単でした。もっと早く気付きたかったな・・・。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0