Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

自作クラスの入ったリスト・配列をソートする方法

まずはリスト。 class Point { int x; int y; char color; Point(int a, int b, char c) { this.x = a; this.y = b; this.color = c; } int getX() { return this.x; } int getY() { return this.y; } char getColor() { return this.color; } } クラスPoint…

AtCoder Beginner Contest 091

A - Two Coins A+B>=C ? "Yes":"No" B - Two Colors Card Game import java.util.*; import static java.lang.System.*; public class Main { static Scanner sc = new Scanner(System.in); public static void main(String[] args) { HashMap<String,Integer> map = new Has</string,integer>…

No.351 市松スライドパズル

逆シミュレーションする。求めたいのは「最終的に左上のマスが何色であったか」なので、「最終盤面の左上のマスは、最初の盤面のどの位置から運ばれてきたか」を考える。最終盤面の左上のマスの座標をx=0,y=0とおく。操作を後ろから順に行っていって、Rの番…

二分探索

二分探索は、ソートされた配列の中から、特定の要素を高速で見つけ出すアルゴリズムである。線形探索(先頭から末尾まで順番に判定していく)とは桁違いの速さで、具体的には、要素数1000000のとき線形探索では1000000回の判定が必要なのに対して、二分探索…

再帰関数入門・迷路探索編

再帰関数を用いて迷路を探索し、スタートからゴールにたどりつけるかどうかを判定する。使用するのは以下の問題。A - 深さ優先探索 import java.util.*; import static java.lang.System.*; public class Blog { static Scanner sc = new Scanner(System.in)…

ArrayDequeとLinkedList

基本的にはArrayDequeとLinkedListのどちらも、キュー・スタックとして使えるようだ。先頭に挿入:addFirst 末尾に挿入:addLast先頭を取得:getFirst 末尾を取得:getLast先頭を取得して削除:removeFirst 末尾を取得して削除:removeLastここまではArrayDe…

AtCoder Beginner Contest 090

A - Diagonal String s1.substring(0,1) + s2.substring(1,2) + s3.substring(2,3)追記:s1.charAt(0) + s2.charAt(1) + s3.charAt(2) のほうがたぶん速い(コードを書くにしても動かすにしても)。 B - Palindromic Numbers A以上B以下の値をすべて、このブ…

No.8 N言っちゃダメゲーム

n=20,k=4の場合を考えてみることにする。他のかたの解説にもある通り、先攻が勝つためには最後のターンでn-1(ここでは19)を言うのが望ましい。なぜなら、先攻がn-1を言ったとき、次に後攻はn-1にkを足した値(kは1以上)を言わなければならず、必ずn以上(…

再帰関数入門・全探索編

ビット全探索でやった内容(ビット全探索 - Java初心者の競技プログラミング日記)を、 再帰関数でもやってみようという試み。 import java.util.*; import static java.lang.System.*; public class Test { static Scanner sc = new Scanner(System.in); pu…

再帰関数入門・全列挙編

競技プログラミングをそれなりに続けてきたが、いまだに再帰関数について全く理解していないので、ここら辺で一つ学んでおこうと思い、この記事を書くことにした。学習に使うのは以下の問題である。 C - Brute-force Attack要は、「a,b,c」を並べて作ること…

AtCoder Beginner Contest 089

A - Grouping 2 import java.util.*; import static java.lang.System.*; public class Main { static Scanner sc = new Scanner(System.in); public static void main(String[] args) { int n = sc.nextInt(); out.println(n/3); } } 3で割って終わり。こう…

eclipseでJavaFx(メモ)

筆者の環境 ・win7 ・pleiades oxygen ・scene builder【導入編】 ・SceneBuilderでfxmlファイルを開こうとすると「failed to launch jvm」のエラーが出る →このページ(JavaFX Scene Builder 1.x Archive)からダウンロードしたscenebuliderを使う【キーイ…

倍数判定メソッド

long型に収まる数字ならlong型に入れて普通に割り算すればいいのだが、ここではlong型に入らない何千何万桁の数字が、ある数の倍数かどうかを判定するメソッドを紹介する。 static boolean isMultiple (String s, int base, int m) { int temp = 0; for (int…

yukicoder No.539 インクリメント

解くのに3時間くらいかかったが、得られたものはそこそこあった。 この問題、一見すると最後尾の整数を1増やせばいいだけのように思えるが、実際はもっと複雑な解法を要求されている。コードの中で一つ一つ解説する前に、大まかな攻略方針を示したいと思う。…

Javaで使える数学系メソッドまとめ

//最大公約数・最小公倍数(セットで使う) static int gcd (int a, int b) {return b>0?gcd(b,a%b):a;} static int lcm (int a, int b) {return a*b/gcd(a,b);} //素数判定 static boolean isPrime (int n) { if (n==2) return true; if (n<2 || n%2==0) re…

yukicoder No.652 E869120 and TimeZone

A問題に引き続いて時刻の問題。 import java.util.*; import static java.lang.System.*; public class Main { static Scanner sc = new Scanner(System.in); public static void main(String[] args) { int h = sc.nextInt(); int m = sc.nextInt(); String…

yukicoder No.651 E869120 and Driving

はじめてyukicoderコンテストに出場しました。結果はABC完答、DE放棄。 時速100kmでakm移動したときにかかる時間は。a/100時間。小数の問題があるのと、どちらにせよこのあと現在時刻にかかった時間を足して計算しなければならないので、分に直す。 目的地に…

「絶対・相対誤差10^(-n)以下であれば正答とみなされる」の意味

yukicoderで以下の問題を解いていて、一つ疑問に思ったので記事にすることにした。 No.379 五円硬貨 - yukicoder 問題文には「相対誤差または絶対誤差が10^(-12)以下であれば正答と見なされる」と書いてある。このとき、解答では小数点以下何桁まで出力する…

ローマ数字をアラビア数字に変換するメソッド

ローマ数字からアラビア数字に変換するメソッドと、アラビア数字からローマ数字に変換するメソッド。 static int RomanToArabic (String s) { String[] a = {"IV","IX","XL","XC","CD","CM"}; String[] b = {"IIII","VIIII","XXXX","LXXXX","CCCC","DCCCC"};…

yukicoder No.457 (^^*)

左カッコ一つ一つに対して、文字列の最後まで探索し、その間に現れる左向きと右向きの数を数え上げる。 import java.util.*; public class Main { static Scanner sc = new Scanner(System.in); public static void main(String[] args) { String s = sc.nex…

マップを値でソートするメソッド

追記:もっと簡単な書きかたを見つけました マップを値でソートする方法 - Java初心者の競技プログラミング日記 マップを値でソートするメソッド。上のメソッドは、マップを渡すと、値でソートされたマップが戻り値として返されるメソッド。下のメソッドは、…

ビット全探索

ビット全探索とは、二進数とビットを用いて、ある集合の部分集合を全列挙(全探索)するアルゴリズムのこと。 public class Blog { public static void main(String[] args) { //集合 String[] ar = {"a","b","c"}; //要素数 int n = 3; //以下メイン処理 fo…

迷路探索メソッド

迷路を探索するメソッド。 幅優先探索が分からなかったので、Listを使ってそれっぽく作ってみた。 以下のような問題で利用できる。 C: 幅優先探索 - AtCoder Beginner Contest 007 | AtCoder D: Grid Repainting - AtCoder Beginner Contest 088 | AtCoder …

AtCoder Beginner Contest 088

A - Infinite Coins import java.util.*; public class Main { static Scanner sc = new Scanner(System.in); public static void main(String[] args) { int n = sc.nextInt(); int a = sc.nextInt(); if (n%500 <= a) {System.out.println("Yes");} else {…

基数変換メソッド

n進数snをm進数に変換するメソッド。 使用できる基数(n,m)は2以上36以下。 static String BaseConversion (String sn, int n, int m) { String sm = Long.toString(Long.parseLong(sn,n),m); return sm; } 使用例 //10進数5を2進数に System.out.println(B…

Javaで基数変換(10進数からn進数、n進数から10進数)

yukicoderの[No.499 7進数変換]を解いていて、10進数で与えられる数値を7進数に変換する必要があったので、自分は数値を7で割りながらその余りを求めていく方法で解いた。以下がその僕の回答だ。 #236582 No.499 7進数変換 - yukicoderしかし調べていくと、…

yukicoder No.508 超ゆとり教育

解説にもある通り、与えられる面積の最高値(10^12)であっても、円周率を3として計算してみると、大体570000くらいになる。よって、たとえ1を出力しようが999を出力しようが、誤差は1000000以内に抑えられてしまう。1~1000001までの正整数を出力しておけば…

Javaの型変換について

Javaのデータ型は、基本型(プリミティブ型)や参照型、クラス型などさまざまに分類され、型変換のさいには山ほどの規則と注意点があるということなのだが、ここではとりあえず、それぞれの型同士の相互変換が成り立つか、成り立つとすればどのような方法で…

Mapをキーでソートする方法

マップをソートするには、まずキーをObject型の配列に格納し、配列をソートして、その配列をもとにしてマップから順番に値を取り出していく……ということを以前はやっていたのだが、よくよく調べてみると、自動でソートしてくれるTreeMapなるものが存在してい…

yukicoder No.628 Tagの勢い

要はどうやってマップを値でソートするか、だと思う。自分はマップを値でソートする方法が全く分かっていなかったので、これまでは、こういう問題が出たときには、キーに数値、値に文字列を入れてキーでソートして解いてきた。値でソートするよりも、キーで…