なんともいえない一日になってしまった。Codeforces#222

今日は待ち合わせのためにぼんやりしてた感じ。
午前中という話から気づけば18時前でした。

Arcanos微更新
f0019846_4272849.jpg


まあ後はjubeatちょっとがんばりましたよってぐらい

f0019846_4274953.jpg


f0019846_4281727.jpg


f0019846_4282918.jpg

イイリザルトw

f0019846_4284961.jpg

ナイトメアメタル。なんとか一発目で。

f0019846_4292787.jpg

PUNISHER銅◆

f0019846_4294690.jpg

格ゲーフルコン

f0019846_430422.jpg

セツナトリップSS

f0019846_4302041.jpg

ガレージハウスフルコン

f0019846_4304099.jpg

カラオケリミフルコン

f0019846_4305664.jpg

スクリーンスコア伸びた。

f0019846_4313393.jpg

サナ・モレッテ・エ・ネンテフルコン

と程々にして、帰宅後はCodeforces#222

A問題は、ダイスを順番に2人が振って、3人めが振ったダイスの絶対値が小さいほうが勝利。
同じであれば引き分けのときの、勝ち、引き分け、負けを出力せよという問題。
単純に全部計算させるだけ。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] st = br.readLine().split(" ");
int a = Integer.parseInt(st[0]);
int b = Integer.parseInt(st[1]);
int awin = 0;
int bwin = 0;
int draw = 0;
for(int i = 1 ; i <= 6 ; i++){
int aabs = Math.abs(i-a);
int babs = Math.abs(i-b);
if(aabs < babs){
awin++;
}else if(aabs == babs){
draw++;
}else{
bwin++;
}
}
System.out.println(awin+" "+draw+" "+bwin);
}
}


B問題は、1回めの通過タイムと、2回目の通過タイムが与えられ、
上位タイムk個という方式から、1回目、2回目それぞれ順位k/2番目までを通過とするとき、
タイム的に通過する可能性がある場合は1を出力、なければ0を出力せよという問題。

例えばタイムが
1 6
2 7
3 8
4 9
5 10

となっていれば、kが6であれば上位3名は決勝進出である。
つまりこの場合、1,2,3,6,7,8が対象になる。
次に、タイム的にいい6つは、1,2,3,4,5,6なので、
答えは
11111
11100を返すというふうになる。
処理がめんどくさい。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;

public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String st = br.readLine();
int n = Integer.parseInt(st);
int[] a = new int[n];
int[] b = new int[n];
int[] nums = new int[2*n];
for(int i = 0 ; i < n ; i++){
String[] str = br.readLine().split(" ");
a[i] = Integer.parseInt(str[0]);
nums[2*i] = a[i];
b[i] = Integer.parseInt(str[1]);
nums[2*i+1] = b[i];
}
Arrays.sort(nums);
int[] aranked = new int[n];
int[] branked = new int[n];
int aindex = 0;
int bindex = 0;
for(int i = 0 ; i < nums.length ; i++){
if(aindex != a.length && a[aindex] == nums[i]){
aranked[aindex] = (i+1);
aindex++;
}
if(bindex != b.length && b[bindex] == nums[i]){
branked[bindex] = (i+1);
bindex++;
}
}
int acount = 0;
int bcount = 0;
int k = n;
for(int i = 0 ; i < aranked.length ; i++){
if(aranked[i] <= k)acount++;
}
for(int i = 0 ; i < branked.length ; i++){
if(branked[i] <= k)bcount++;
}
acount = Math.max(acount, n/2);
bcount = Math.max(bcount, n/2);
StringBuilder astr = new StringBuilder();
StringBuilder bstr = new StringBuilder();
for(int i = 0 ; i < a.length ; i++){
if(i < acount){
astr.append("1");
}else{
astr.append("0");
}
}

for(int i = 0 ; i < b.length ; i++){
if(i < bcount){
bstr.append("1");
}else{
bstr.append("0");
}
}
System.out.println(astr.toString());
System.out.println(bstr.toString());
}
}


C問題は、時間中には解けませんでしたが、解きました。
迷路があり、通りぬけできるようになっている。そこからk個塞いでも、
もとの迷路で通り抜けられないところがないように迷路を作れという問題。

考え方的には、最初に全部埋まっている状態にして、開始できる位置から、
空いている場所-K個だけ幅探索で埋めていくだけで良いことになる。
やはり実装が大変か。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] st = br.readLine().split(" ");
int n = Integer.parseInt(st[0]);
int m = Integer.parseInt(st[1]);
int k = Integer.parseInt(st[2]);
String[] s = new String[n];
int notwallcount = 0;
boolean[][] iswall = new boolean[n][m];
for(int i = 0 ; i < n ; i++){
s[i] = br.readLine();
}

for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(s[i].charAt(j) == '#'){
iswall[i][j] = true;
}else{
notwallcount++;
}
}
}

boolean[][] used = new boolean[n][m];

for(int i = 0 ; i < n ; i++){
int count = 0;
for(int j = 0 ; j < m ; j++){
if(iswall[i][j])continue;
used = new boolean[n][m];//n is y m is x
count = 1;
used[i][j] = true;
Queue q = new LinkedList();
q.add(j+","+i);

while(!q.isEmpty()){
if(count == (notwallcount-k))break;
String[] substr = q.poll().split(",");
int x = Integer.parseInt(substr[0]);
int y = Integer.parseInt(substr[1]);
if(isValid(x-1,y,m,n,iswall) && !(x-1 == j && y == i) && !used[y][x-1]){
used[y][x-1] = true;
count++;
q.add((x-1)+","+y);
}
if(count == (notwallcount-k))break;
if(isValid(x+1,y,m,n,iswall) && !(x+1 == j && y == i) && !used[y][x+1]){
used[y][x+1] = true;
count++;
q.add((x+1)+","+y);
}
if(count == (notwallcount-k))break;
if(isValid(x,y-1,m,n,iswall) && !(x == j && y-1 == i) && !used[y-1][x]){
used[y-1][x] = true;
count++;
q.add(x+","+(y-1));
}
if(count == (notwallcount-k))break;
if(isValid(x,y+1,m,n,iswall) && !(x == j && y+1 == i) && !used[y+1][x]){
used[y+1][x] = true;
count++;
q.add(x+","+(y+1));
}

}
if(count == (notwallcount-k))break;
}
if(count == (notwallcount-k))break;
}

for(int i = 0 ; i < n ; i++){
StringBuilder sb = new StringBuilder();
for(int j = 0 ; j < m ; j++){
if(!iswall[i][j] && !used[i][j]){
sb.append("X");
}else if(iswall[i][j]){
sb.append("#");
}else{
sb.append(".");
}
}
System.out.println(sb.toString());
}
}

public static boolean isValid(int x,int y,int m,int n,boolean[][] iswall){
if(x >= 0 && x < m && y >= 0 && y < n && !iswall[y][x])return true;
return false;
}
}

  by ddrer-yossi | 2013-12-29 23:26 | codeforces | Comments(0)

<< 着る毛布が届いた。Good b... あまり有意義でない一日だった。... >>

SEM SKIN - DESIGN by SEM EXE