SPADA二日目、Codeforces#212

うまく休みを取れたので。11時頃から。
二日目にして結構空いてました。
f0019846_16263083.jpg

遠距離らぶめーるフルコン
f0019846_16281864.jpg

Insane Techniquesフルコン
f0019846_1629632.jpg

Valgusフルコン
f0019846_1630025.jpg

Odinフルコン
f0019846_16303360.jpg

罪と罰フルコン
f0019846_1631326.jpg

WOBBLE IMPACTフルコン
f0019846_16322411.jpg

Miracle 5ympho xフルコン
f0019846_1633991.jpg

INSOMNIAフルコン
f0019846_16333120.jpg

MAD ATTACKフルコン
f0019846_1634333.jpg

Atropos難

昼過ぎから混んできたのでポップンやリフレクに逃げる。
f0019846_16344233.jpg

花爛漫銅★
f0019846_16345970.jpg

カイジュウHフルコン

戻ったら空いてたので再度弐寺
f0019846_16352944.jpg

ALBAフルコン
f0019846_1637829.jpg

m1dy Deluxeフルコン
f0019846_1638331.jpg


本格的に混んできたので一旦帰宅。

Rainbow guitar weepsフルコン
f0019846_16423872.jpg

Deviz Sacrificeフルコン
f0019846_16431897.jpg

Anotherは難ついた。
f0019846_16434273.jpg

Codeforcesまであまり時間ないので、ここからDPプレー。
f0019846_164422.jpg

手始めに五段
f0019846_16443680.jpg

六段。苦しくなってきた
七段は2連続ワナパおち、3回目サマバケ落ち。4回めにして。
f0019846_16451341.jpg

40%(ひどい。 全部40とかいう奇跡。

帰宅後は買ってきた炭酸飲料を準備しつつCodeforces#212

A問題は、8*8マップが与えられていて斜め2左上、右上、左下、右下に動けるナイトが2体いる。
出会えない地帯が#で表されているので、それ以外のところで出会えるかどうかという問題。
実装がかなり大変。

座標誤差は絶対値で必ず4で割り切れないといけない。
座標毎にそれを計算して、それぞれのナイトで出会える候補位置を求めておく。
最後に、その座標を4で割った値が奇数か偶数か、両方が合致したときだけYESを返す。
奇数回移動と偶数回移動になってしまうと出会えないので。
33分かかりました。闇。

import java.util.Scanner;

public class Main2 {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.nextLine();
for(int i = 0 ; i < t ; i++){
String[] chesser = new String[8];
boolean[][] firstK = new boolean[8][8];
boolean[][] secondK = new boolean[8][8];
for(int j = 0 ; j < 8 ; j++){
chesser[j] = sc.nextLine();
}
int st1_x = -1;
int st1_y = -1;
int st2_x = -1;
int st2_y = -1;
int ct = 0;
for(int j = 0 ; j < 8 ; j++){
for(int k = 0 ; k < 8 ; k++){
if(chesser[j].charAt(k) == 'K'){
if(ct == 0){
st1_x = k;
st1_y = j;
firstK[j][k] = true;
ct++;
}else{
st2_x = k;
st2_y = j;
secondK[j][k] = true;
break;
}
}
}
}

for(int j = 0 ; j < 8 ; j++){
for(int k = 0 ; k < 8 ; k++){
if(chesser[j].charAt(k) == '.' || chesser[j].charAt(k) == 'K'){
if(Math.abs((st1_x-k)+(st1_y-j)) % 4 == 0 && (st1_x-k) % 2 == 0 && (st1_y-j) % 2 == 0){
firstK[j][k] = true;
}
if(Math.abs((st2_x-k)+(st2_y-j)) % 4 == 0 && (st2_x-k) % 2 == 0 && (st2_y-j) % 2 == 0){
secondK[j][k] = true;
}
}
}
}
boolean meet = false;
for(int j = 0 ; j < 8 ; j++){
for(int k = 0 ; k < 8 ; k++){
if(firstK[j][k] && secondK[j][k]){
if(Math.max(Math.abs(st1_x-k),Math.abs(st1_y-j)) / 2 % 2 == Math.max(Math.abs(st2_x-k),Math.abs(st2_y-j)) / 2 % 2)
meet = true;
break;
}
}
}
/*for(int j = 0 ; j < 8 ; j++){
for(int k = 0 ; k < 8 ; k++){
if(firstK[j][k]){
System.out.print("o");
}else{
System.out.print("x");
}
}
System.out.println();
}*/
if(meet){
System.out.println("YES");
}else{
System.out.println("NO");
}
if(i != t-1)sc.nextLine();
}
}
}


B問題は、階段の数と、汚い階段の数と、汚い階段の配列が与えられていて、
1から階段の数まで向かうのに2つ抜かしまで動ける。
最上までいけるかどうか。

注意すべき点は2つ。
1,汚い階段が最初の階もしくは最後の階な場合は必ずNo
2,汚い階段は0の場合がある(配列に格納とかしてしまうとエラーになる

それを踏まえれば、汚い階段の配列をソートして、a[i]+1 == a[i+1] && a[i+1]+1 == a[i+2]
の判定をするのみ。配列外参照にならないように気をつけましょう。

import java.util.Arrays;
import java.util.Scanner;

public class Main2 {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int d = sc.nextInt();
if(d == 0){
System.out.println("YES");
}else{
int[] dirty = new int[d];
for(int i = 0 ; i < d ; i++){
dirty[i] = sc.nextInt();
}
Arrays.sort(dirty);
int st = dirty[0];
int en = dirty[d-1];
int now = 1;
if(st == now || en == n){
System.out.println("NO");
}else{
boolean ok = true;
for(int i = 0 ; i < d-2 ; i++){
if(dirty[i]+1 == dirty[i+1] && dirty[i+1]+1 == dirty[i+2]){
ok = false;
break;
}
}
if(!ok){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
}
}


C問題は、配列が順列で与えられていて、1回だけ2要素を交換して挿入ソートを行う時、
最小回数になる通りと、最小回数を出力せよという問題。難しい。
愚直に交換前と交換後の2箇所の差分が大きくなるようなところを求めるようにしたが・・・。

  by ddrer-yossi | 2013-11-14 23:24 | Beatmania | Comments(0)

<< 歯医者と皮膚科。弐寺絶好調 祝 SPADA稼働 >>

SEM SKIN - DESIGN by SEM EXE