Beatmania 2P側八段、Codeforces Round #166

本日はお昼は募集要項が
100-300-300-400-600-500-200-200-200-400という難問に取り組みました。

夜はゲーセン勢になり、取り敢えず2P側でどのくらいの実力があるか、
六段から試して行きました。

Beatmania 2P側八段、Codeforces Round #166_f0019846_22111687.jpg


Beatmania 2P側八段、Codeforces Round #166_f0019846_22112975.jpg


Beatmania 2P側八段、Codeforces Round #166_f0019846_22114352.jpg


皿の回せない八段が誕生しましたとさ。

Beatmania 2P側八段、Codeforces Round #166_f0019846_22121092.jpg


その後は1P側に戻り、難埋めへ。
というよりも、Timepiece phase IIやりたさに佐々木曲粘着してると、
たまゆらがフルコンできそうだったので挑む。
Concertinoもmiss6で、途中までつながってた。

Beatmania 2P側八段、Codeforces Round #166_f0019846_2213996.jpg


ついでにWONDER WALKERも。
Beatmania 2P側八段、Codeforces Round #166_f0019846_22131977.jpg


帰宅後はCodeforcesに参加。

A問題は、西暦で同じ数字がでないはじめての年を、ある年からで答える問題。
どこかしらで出るので、虱潰しでok。


import java.util.Scanner;

public class Main2 {

public static void main(String args[]){
Scanner input = new Scanner(System.in);
int a = input.nextInt();
System.out.println(ressya(a));
}

public static int ressya(int a){
while(true){
a++;
String st = String.valueOf(a);
boolean isok = true;
for(int i = 0 ; i < st.length() ; i++){
for(int j = i ; j < st.length() ; j++){
if(i != j){
if(st.charAt(i) == st.charAt(j)){
isok =false;
break;
}
}
}
if(!isok)break;
}
if(isok)return a;
}
}
}


Bは、どっかの行か列の数字が、すべて素数になるように数値を加えていった時に、
最小で済む値を求める問題。それぞれ行列について調べなきゃいけないが、
調べ方を工夫し忘れて本番ではTLEした。

import java.util.Scanner;

public class Main2 {

public static void main(String args[]){
Scanner input = new Scanner(System.in);
int row = input.nextInt();
int col = input.nextInt();
int[][] matrix = new int[row][col];
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
matrix[i][j] = input.nextInt();
}
}
System.out.println(ressya(row,col,matrix));
}

public static int ressya(int row,int col,int[][] matrix){
int min = 999999999;
int tmp;
int[] nextprime = new int[100000];

nextprime[0] = 1;nextprime[1] = 0;
for(int a = 3 ; a <= 100000 ; a++){
int x = a;
int index = 0;
while(true){
boolean isok = true;
if(x % 2 == 0){
isok = false;
}else{
for(int i = 3 ; i <= Math.sqrt(x) ; i+=2){
if(x % i == 0){
isok = false;
break;
}
}
}
if(isok){
nextprime[a-1] = index;
break;
}
x++;
index++;
}
}

for(int i = 0 ; i < row ; i++){
tmp = 0;
for(int j = 0 ; j < col ; j++){
tmp += nextprime[matrix[i][j]-1];
}
min = Math.min(tmp, min);
}
for(int i = 0 ; i < col ; i++){
tmp = 0;
for(int j = 0 ; j < row ; j++){
tmp += nextprime[matrix[j][i]-1];
}
min = Math.min(tmp, min);
}
return min;
}

}


方針としては、次の素数までに加える必要がある数値を、
予め配列に計算させて持っておくことにした。
これにより、各数値に素数判定をする必要がなくなり、配列を調べるだけで良くなる。
2ならば0、3ならば0、4ならば1、5ならば0といった具合で。

C問題は、非常に問題が読みづらかった。
内容としては、1~nまでの数値を、k人で分ける。
それぞれの人が持ってる配列が、等差数列にならないように数値を分けろという問題。
やり方は色々あると思います。
自分は最後の配列だけ等差数列にならないように1ずらす方式を取りました。


import java.util.Scanner;

public class Main2 {

public static void main(String args[]){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int k = input.nextInt();
ressya(n,k);
}

public static void ressya(int n,int k){
if(n / k < 3){
System.out.println(-1);
}else{
StringBuilder sb = new StringBuilder();
for(int i = 1 ; i <= k ; i++){
if(i != k){
sb.append(((i % k)+1));
sb.append(" ");
}else{
sb.append((i % k)+1);
}
}
StringBuilder sba = new StringBuilder();
int number = n/k;
for(int i = 1 ; i <= number-1 ; i++){
sba.append(sb);
sba.append(" ");
}
for(int i = ((n/k)-1)*k+1 ; i <= n ; i++){
if((i-1)/k == (number-1)){
if(i == n){
sba.append((((i+1) % k)+1));
}else{
sba.append((((i+1) % k)+1));
sba.append(" ");
}
}else{
if(i == n){
sba.append(((i % k)+1));
}else{
sba.append(((i % k)+1));
sba.append(" ");
}
}
}
System.out.println(sba);
}
}
}


1~11であれば
12312323112
1~9であれば
123123312といった具合です。

D問題は、問題自体は簡単ですが、解くのは簡単ではないかもです。
良い文字と悪い文字の判定があり、
多くても悪い文字がk個以下になるような部分文字列の数を求めるという問題。
TLE解しか投げられませんでした。

  by ddrer-yossi | 2013-02-11 22:08 | codeforces

<< DJT DP八段取得、☆12追加2曲 tricoro DP七段取得、... >>

SEM SKIN - DESIGN by SEM EXE