School Regional Team Contest, Saratov, 2011

今日はcodeforcesの5時間耐久に挑んできました。流石に3時間ぐらいすると、
頭が混乱してきて、まったくうまくいかなくなりました。

problem(A)

1問目。エレベーターが前か後ろか、左か右かでどっちなのか判定する問題。
正直問題分の意味がぜんぜんわからなかったのと、入出力がうまくいかないのとで、ミス連発。

import java.util.*;
import java.io.*;

public class Test2 {

public void doain() throws Exception{
Scanner input = new Scanner(new FileReader("input.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
String s = input.nextLine();
int n = input.nextInt();
pw.println(hesHand(s,n));
input.close();
pw.flush();
pw.close();
}

public static String hesHand(String s,int n){
if(s.equals("front") && n == 1 || s.equals("back") && n == 2){
return "L";
}else{
return "R";
}
}


public static void main(String[] args) throws Exception{
(new Test2()).doain();
}


}

problem(B)

問題文長い。しかも冗長な部分だらけ。
抜粋すれば、既に置かれている位置をカウントせずに、現在位置からルーレットで回して行って
最初にあたる位置を求めるという問題。

import java.util.*;
import java.io.*;

public class Test2 {

public void doain() throws Exception{
Scanner input = new Scanner(new FileReader("input.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
int n = input.nextInt();
int k = input.nextInt();
int person[] = new int[n];
for(int i = 0 ; i < n ; i++){
person[i] = input.nextInt();
}
pw.println(question(n,k,person));
input.close();
pw.flush();
pw.close();
}

public static int question(int n,int k,int[] person){
while(true){
if(k > n){
k = 0;
}else if(person[k-1] != 0){
return k;
}
k++;
}
}


public static void main(String[] args) throws Exception{
(new Test2()).doain();
}


}

problem(C)

これはくまのプーさん問題。というのはどうでもよく、
3リットル分ちょうどを3回まで取って行って、残りはいくつになるかという問題。
5 3 7ならば 2 0 1 となり、3を返す。

import java.util.*;
import java.io.*;

public class Test2 {

public void doain() throws Exception{
Scanner input = new Scanner(new FileReader("input.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
int n = input.nextInt();
int k = input.nextInt();
int person[] = new int[n];
for(int i = 0 ; i < n ; i++){
person[i] = input.nextInt();
}
pw.println(question(n,k,person));
input.close();
pw.flush();
pw.close();
}

public static int question(int n,int k,int[] person){
int sum = 0;
for(int i = 0 ; i < person.length ; i++){
int count = 0;
while(count < 3){
if(person[i]-k >= 0){
person[i] -= k;
}
count++;
}
sum += person[i];
}
return sum;
}


public static void main(String[] args) throws Exception{
(new Test2()).doain();
}


}

problem(D)
これが一番大変でした。農地を平等に与えずに、縦横の平行線でわける分け方が何通りあるかという問題。
実装が重い問題。

import java.util.*;
import java.io.*;

public class Test2 {

public void doain() throws Exception{
Scanner input = new Scanner(new FileReader("input.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
int n = input.nextInt();
int k = input.nextInt();
int cornfield[][] = new int[n][k];
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < k ; j++){
cornfield[i][j] = input.nextInt();
}
}
int[] tmps = new int[3];
tmps[0] = input.nextInt();
tmps[1] = input.nextInt();
tmps[2] = input.nextInt();
Arrays.sort(tmps);
pw.println(numbers(n,k,cornfield,tmps[0],tmps[1],tmps[2]));
input.close();
pw.flush();
pw.close();
}

public static int numbers(int n,int k,int[][] cornfield,int Ac,int Bc,int Cc){
//yoko
int count = 0;
int[] tmpN = new int[3];
if(n >= 3){
for(int j = 1 ; j < n-1 ; j++){
for(int i = 0 ; i < j ; i++){
tmpN[0] = 0;
tmpN[1] = 0;
tmpN[2] = 0;
for(int row = 0 ; row < k ; row++){
for(int col = 0 ; col < i+1 ; col++){
tmpN[0] += cornfield[col][row];
}
}
for(int row = 0 ; row < k ; row++){
for(int col = i+1 ; col < j+1 ; col++){
tmpN[1] += cornfield[col][row];
}
}
for(int row = 0 ; row < k ; row++){
for(int col = j+1 ; col < n ; col++){
tmpN[2] += cornfield[col][row];
}
}
Arrays.sort(tmpN);
//System.out.println(i+","+j+","+Ac+","+tmpN[0]+","+Bc+","+tmpN[1]+","+Cc+","+tmpN[2]);
if(Ac == tmpN[0] && Bc == tmpN[1] && Cc == tmpN[2])count++;
}
}
}

if(k >= 3){
for(int j = 1 ; j < k-1 ; j++){
for(int i = 0 ; i < j ; i++){
tmpN[0] = 0;
tmpN[1] = 0;
tmpN[2] = 0;
for(int col = 0 ; col < n ; col++){
for(int row = 0 ; row < i+1 ; row++){
tmpN[0] += cornfield[col][row];
}
}
for(int col = 0 ; col < n ; col++){
for(int row = i+1 ; row < j+1 ; row++){
//System.out.println(col+"$"+row);
tmpN[1] += cornfield[col][row];
}
}
for(int col = 0 ; col < n ; col++){
for(int row = j+1 ; row < k ; row++){
tmpN[2] += cornfield[col][row];
}
}
Arrays.sort(tmpN);
//System.out.println(i+","+j+","+Ac+","+tmpN[0]+","+Bc+","+tmpN[1]+","+Cc+","+tmpN[2]);
if(Ac == tmpN[0] && Bc == tmpN[1] && Cc == tmpN[2])count++;
}
}
}
return count;
}


public static void main(String[] args) throws Exception{
(new Test2()).doain();
}


}

problem(E)
理論はわかりませんが、正方形のマス目にナイトを置いて行って、置けなくなったら負けというゲーム。
まさか全探査やるわけないだろうし、法則があるのだろうと思い、
偶数奇数で書いたら見事にビンゴ。でも根拠がないんですよね・・・。

import java.util.*;
import java.io.*;

public class Test2 {

public void doain() throws Exception{
Scanner input = new Scanner(new FileReader("input.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
int a = input.nextInt();
int[] b = new int[a];
for(int i = 0 ; i < a ; i++){
b[i] = input.nextInt();
pw.println(matches(b[i]));
}
input.close();
pw.flush();
pw.close();
}

public static int matches(int a){
return (a+1) % 2;
}


public static void main(String[] args) throws Exception{
(new Test2()).doain();
}


}

SpiderとかBrevity is Soul of Witは問題読んでもよくわかりませんでした。
結局5問正解で終了。まあ、半分解いたってところでしょうか。
ここまで2時間半なので、残り半分の時間は手も足も出なかったということになります。
うーん、くやしいね。

夜は友人たちとまた海鮮丼屋へ。というか私が誘いました。

f0019846_203733.jpg


いやーまた食いたいですね。

そしておなじみのdiva。

f0019846_1562021.jpg

  by ddrer-yossi | 2011-10-18 23:42 | codeforces | Comments(0)

<< 意識の低さが露呈しちゃう何か 隕石が降って人類滅亡 >>

SEM SKIN - DESIGN by SEM EXE