僕が考えたこととライフハック

政治経済、ITについて書く。

#2競プロ ABC078 C-HSI Math.pow()はdoubleで返ってくるから気を付けて!!!

C問題も解き始めました隆です。

ABC078のC問題解いてて知ったんですけどMath.pow()はdoubleで返ってくるんですね。

Javaの公式リファレンスを読んでみると

static double pow(double a, double b)

https://docs.oracle.com/javase/jp/8/docs/api/

と書いてありました。

実際どうなるのかABC078 C-HSIで僕が間違ったのを例として挙げます。

今回の問題↓

https://atcoder.jp/contests/abc078/tasks/arc085_a

 

解法

問題自体は「ほんとにC問題か???」というくらい、比較的簡単だと思います。

解法は、

「acした問題×100+TLEした問題×1900、と2のTLEした問題の数乗したものを掛け合わせる。」

です。

ソースコード(WAしたもの)

f:id:rynsk02:20190426122257p:plain

(今見たら、謎のインデントがある・・・・)

”解法”で書いた通り、簡単な式一行で終わります。

ですが、最初に書いた通り、戻り値がdoubleで返ってくるMath.pow()で計算したので答えの数値に”.0”がついて、すべてWA。

例えば、n=100,m(tle)=5 の時 答えは608000ですが、このコードだと608000.0となります。

答え自体はあっているのでintでキャストしてあげれば、小数点以下がなくなりいい感じになるはず。

ソースコード(ACしたもの)

import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int tle = sc.nextInt();
int ac = n-tle;
System.out.println((int)((ac*100 + tle*1900)*Math.pow(2,tle)));
}
}