はじめに
提出時のコードの入力受け取りのみ書き換えてあります。
では、見ていきましょう
A - Four Points
問題文はこちら
長方形なので、(x1,y1)、(x1,y2)、(x2,y2)、(x2,y1)の四点で構成されています。
したがって、x座標、y座標それぞれを比較して、ペアになっていない値を出力すれば良いです。
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}})$
あとはこれを実装するだけです。
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枚を超えていない場合は残りの金額をソートして一番高い商品から順に使っていけば答えが求まります。
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を順に探す、という手法です。
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);
}
}
いざ実装してみるとすんごい簡単でした。もっと早く気付きたかったな・・・。