Yossi Survivor MAX:codeforces
2020-02-10T21:45:55+09:00
ddrer-yossi
某Yの中の人の趣味を綴った雑記。発狂放置なDDRerです。 2dxはTRI,SPA,PEN等速十段 DDR(1106-7746)
Excite Blog
少し部活動するなど
http://ddrer.exblog.jp/31050550/
2020-01-30T21:32:00+09:00
2020-02-10T21:45:55+09:00
2020-02-10T21:45:55+09:00
ddrer-yossi
codeforces
今日の朝食 昼食
そして夕食。退勤は19時。
その後は部活動して20時半過ぎに。
内容としてはEducational Codeforces Round 80をやっていました。
A問題は貪欲に調べて流す。問題文の理解が大変でした。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader stdR = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(stdR.readLine());
for(int i = 0 ; i < N ; i++) {
String[] str = stdR.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int d = Integer.parseInt(str[1]);
boolean ok = false;
for(int j = 0 ; j <= n ; j++) {
int x = j + (int)Math.ceil((double) d / (j + 1));
if(x <= n) {
ok = true;
break;
}
}
if(ok) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
}
B問題は式変形してあげると、b + 1 = 10^|b.length|となるので、実はO(N)で出せる。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class B {
public static void main(String args[]) throws IOException {
BufferedReader stdR = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(stdR.readLine());
for(int i = 0 ; i < N ; i++) {
String[] s = stdR.readLine().split(" ");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
System.out.println((long)a * (String.valueOf(b + 1).length() - 1));
}
}
}
そこからはゲーセンに。
Wave of Craze EXH
Grip & Break down !! - SDVX Edit.- EXH
Electric "Sister" Bitch EXHで9821514 AAA+ Uクリア
DIABLOSIS::Nāga EXH 9873294 AAA+ Uクリア
Destroy EXH 9950980 S Uクリア
Dogeza Stairs EXH 9936014 S Uクリア
NEO TREASON EXH 9939678 S Uクリア
PULSE LASER INF 9908906 S Uクリア
Lancelot ~Flame of the Rebellion~ EXH 9849796 AAA+ Uクリア
Lord=Crossight EXH 9809607 AAA+ Uクリア
リフレクへ。いただき!桃色ゾンビにあん HARD 97.7% AAA フルコン
GUILTY WHはmiss1 93.9%
もう一度やっても93.0% miss1だったので本当にGUILTY
jubeatへ。croiX EXTREME 886060 A HARD
Super GERO GE-RO EXRTREME 820801 B HARD
ラストはオンゲキ。sweet little sister MASTER 1006836 SSS 14.52 -> 14.54となりました。
]]>
ぷよクエ蒸気の塔諦め。エイプリルフールなんてなかった。桜(A)難
http://ddrer.exblog.jp/30590905/
2019-04-01T16:18:00+09:00
2019-05-12T16:40:38+09:00
2019-05-12T16:40:38+09:00
ddrer-yossi
codeforces
今日の朝食兼昼食17時半に退勤し、夜はチョコレートを少し食べた。
そしてゲーセンに。
INF-B 《L-aste-R》 EXH 9536805 AA+ Uクリア
見世物ライフ MXM 9871515 AAA+ Uクリア
弐寺では桜(A)を難
Electric "Sister" Bitch EXH 9971408 S Uクリア
↓↓↓ EXH 9730713 AAA Uクリア
IKAROS DYNAMITE!!!! EXH 9599910 AA+ Uクリア
Onigo EXH 9882681 AAA+ Uクリア
GERBERA EXH 9858870 AAA+ Uクリア
Prayer EXH 9663536 AA+ Uクリア
ここからリフレク。printemps MEDIUM 99.6% S フルコン
幻想リフレクト MEDIUM 99.5% S フルコン
FUJIMORI -祭- FESTIVAL MEDIUM 99.3% S フルコン
GENOM SCREAMS MEDIUM 99.0% S フルコン
jubeatへ。Evans EXTREME 873664 A Hard
KHAMEN BREAK -SDVX Infinity MashUp- EXTREME 885142 A Hard
夜はCodeforcesのApril Contestに参加。
A問題はThanos Sortを実行した結果、ソートされている数列がいくつあるのか出す問題。
条件は甘いのでシミュレーションやるだけ。
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.LinkedList;import java.util.Queue;public class Main {static int[] a;public static void main(String args[]) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());a = new int[n];String[] str = br.readLine().split(" ");for(int i = 0 ; i < n ; i++) {a[i] = Integer.parseInt(str[i]);}int max = 0;Queue<String> q = new LinkedList<String>();q.add(0+","+(n - 1));while(!q.isEmpty()) {String[] tmp = q.poll().split(",");int start = Integer.parseInt(tmp[0]);int end = Integer.parseInt(tmp[1]);if(isSorted(start,end)) {max = Math.max(max, (end - start + 1));}if(end - start != 0) {q.add(start+","+(start + (end - start) / 2));q.add((start + (end - start) / 2 + 1)+","+end);}}System.out.println(max);}public static boolean isSorted(int st,int en) {int num = -1;for(int i = st ; i <= en ; i++) {if(num <= a[i]) {num = a[i];}else {return false;}}return true;}}
F問題は、直線で構成されているアルファベットのみか、カーブを含むアルファベットのみで構成されている文字列かを見る問題でした。
ということに気づかないといけないので謎解き系です。
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main2 {public static void main(String args[]) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s = br.readLine();boolean isstraight = true;boolean iscurve = true;boolean[] curve = {false,true,true,true,false,false,true,false,false,true,false,false,false,false,true,true,true,true,true,false,true,false,false,false,false,false};for(int i = 0 ; i < s.length(); i++) {int c = s.charAt(i) - 65;if(!curve[c]) {iscurve = false;break;}}for(int i = 0 ; i < s.length(); i++) {int c = s.charAt(i) - 65;if(curve[c]) {isstraight = false;break;}}if(iscurve || isstraight) {System.out.println("YES");}else {System.out.println("NO");}}}
]]>
Google Code JamとかCodeforces #298(div2)とか
http://ddrer.exblog.jp/23965097/
2015-04-12T23:30:00+09:00
2015-05-02T16:52:19+09:00
2015-05-02T16:52:19+09:00
ddrer-yossi
codeforces
結果は A-Small,large B-Small,large C-Small D-Smallで57点の2150位。
A問題は、x人立ち上がったら立ち上がるような観客が何人かいるとき、
全員立ち上がるようにするには何人引き立て役が必要かという問題。
人数が少ない方から拾っていって、足りなければ順次補って加算していく方式で問題なし。
import java.io.*;
public class A {
static PrintWriter pw;
public static void main(String args[]) throws Exception{
BufferedReader input = new BufferedReader(new FileReader("../GoogleCodeJam2015/io/A-large.in"));
pw = new PrintWriter(new FileWriter("../GoogleCodeJam2015/io/output.txt"));
int T = Integer.parseInt(input.readLine());
for(int i = 0 ; i < T ; i++){
String[] shys = input.readLine().split(" ");
int maxshy = Integer.parseInt(shys[0]);
int addfriend = 0;
int stand = 0;
for(int j = 0 ; j <= maxshy ; j++){
if(stand < j){
addfriend += j - stand;
stand += j - stand + Character.digit(shys[1].charAt(j), 10);
}else{
stand += Character.digit(shys[1].charAt(j), 10);
}
}
pw.println("Case #"+(i+1)+": "+addfriend);
}
pw.flush();
input.close();
pw.close();
}
}
B問題は、最初のパンケーキが乗っている状態があって、
皿ごとに一人人がついていて、全員一斉に1枚食べる or 分配するので全員待つという動作をする。
人間は無限人いるとき、皿の上にあるパンケーキが、
すべてなくなるまでの最小時間を求めよという問題。
分け方に関してあれこれ考えると見事にはまっていく問題であり、
後は人数が無限人いることにも気づかないとハマる問題であった。
実は皿に乗るパンケーキは多くても1000という条件があるので、
これをもとに分配していけばいいことになる。
ちなみに最初に分配作業をしきって、後は食べるのを見ているだけというのが正答である。
食べてる途中に分配作業をしても、より良い状態になることはない。
人数は無限人いるので、たとえばパンケーキをN枚以下にするというふうにしたとき、
一人目がM枚(M >= N)あるとき、これをN N ...あまりといった分割にして、
新しい人の皿に載せていくようにする。
その動作回数をN枚より多い皿に対してのみ記録していき、
あとはN回足せば良い(Nより小さければ一番皿に載ってる人の分だけかかる)だけである。
正答率45%の難問でした。
import java.util.*;
import java.io.*;
public class B {
static PrintWriter pw;
public static void main(String args[]) throws Exception{
BufferedReader input = new BufferedReader(new FileReader("../GoogleCodeJam2015/io/B-large.in"));
pw = new PrintWriter(new FileWriter("../GoogleCodeJam2015/io/output.txt"));
int T = Integer.parseInt(input.readLine());
for(int i = 0 ; i < T ; i++){
int D = Integer.parseInt(input.readLine());
String[] st = input.readLine().split(" ");
int[] a = new int[D];
for(int j = 0 ; j < D ; j++){
a[j] = Integer.parseInt(st[j]);
}
Arrays.sort(a);
int min = Integer.MAX_VALUE;
for(int j = a[D - 1] ; j >= 1 ; j--){
int tmp = 0;
for(int k = 0 ; k < D ; k++){
if(a[k] > j){
if(a[k] % j != 0){
tmp += a[k] / j;
}else{
tmp += a[k] / j - 1;
}
}
}
tmp += j;
min = Math.min(min, tmp);
}
pw.println("Case #"+(i+1)+": "+min);
}
pw.flush();
input.close();
pw.close();
}
}
C問題は、djkの単位元変換問題。
愚直な実装で作れるかどうか判定していたら間に合わなかったので、
後ろからの計算などを実装することでオーダを省いた。
import java.io.*;
public class CSmall {
static PrintWriter pw;
public static void main(String args[]) throws Exception{
BufferedReader input = new BufferedReader(new FileReader("../GoogleCodeJam2015/io/input.txt"));
pw = new PrintWriter(new FileWriter("../GoogleCodeJam2015/io/output.txt"));
int T = Integer.parseInt(input.readLine());
for(int i = 0 ; i < T ; i++){
String[] str = input.readLine().split(" ");
int L = Integer.parseInt(str[0]);
long X = Long.parseLong(str[1]);
boolean isok = false;
String st = input.readLine();
StringBuilder sb = new StringBuilder();
for(int j = 0 ; j < X ; j++){
sb.append(st);
}
Status first = new Status();
Status second = new Status();
Status third = new Status();
boolean readl = false;
for(int j = 0 ; j < L * X - 2 ; j++){
first = str(first, new Status(sb.charAt(j), false));
//System.out.println(first.c+","+first.minus+","+"phase1:"+j);
if(first.c != 'i' || first.minus)continue;
for(int k = j + 1 ; k < L * X - 1 ; k++){
second = str(second, new Status(sb.charAt(k), false));
//System.out.println(second.c+","+second.minus+","+"phase2:"+k);
if(readl){
third = str(new Status(sb.charAt(k), true), third);
}
if(second.c != 'j'|| second.minus)continue;
if(!readl){
for(int l = k + 1 ; l < L * X ; l++){
third = str(third, new Status(sb.charAt(l), false));
}
readl = true;
}
if(third.c == 'k' && !third.minus){
//System.out.println(j+","+k+","+sb.length());
isok = true;
break;
}
}
readl = false;
second = new Status();
third = new Status();
if(isok)break;
}
if(isok){
pw.println("Case #"+(i+1)+": YES");
}else{
pw.println("Case #"+(i+1)+": NO");
}
pw.flush();
}
input.close();
pw.close();
}
public static Status str(Status st,Status st2){
if(st.c == 'a')return new Status(st2.c,st.minus);
if(st2.minus){
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}
if(st.c == '1'){
if(st2.c == 'i'){
st.c = 'i';
}else if(st2.c == 'j'){
st.c = 'j';
}else if(st2.c == 'k'){
st.c = 'k';
}else if(st2.c == '1'){
st.c = '1';
}
}else if(st.c == 'i'){
if(st2.c == 'i'){
st.c = '1';
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}else if(st2.c == 'j'){
st.c = 'k';
}else if(st2.c == 'k'){
st.c = 'j';
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}else if(st2.c == '1'){
st.c = 'i';
}
}else if(st.c == 'j'){
if(st2.c == 'i'){
st.c = 'k';
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}else if(st2.c == 'j'){
st.c = '1';
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}else if(st2.c == 'k'){
st.c = 'i';
}else if(st2.c == '1'){
st.c = 'j';
}
}else if(st.c == 'k'){
if(st2.c == 'i'){
st.c = 'j';
}else if(st2.c == 'j'){
st.c = 'i';
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}else if(st2.c == 'k'){
st.c = '1';
if(st.minus){
st.minus = false;
}else{
st.minus = true;
}
}else if(st2.c == '1'){
st.c = 'k';
}
}
return new Status(st.c,st.minus);
}
}
class Status{
boolean minus = false;
char c = 'a';
Status(char c,boolean minus){
this.c = c;
this.minus = minus;
}
Status(){
minus = false;
c = 'a';
}
}
でも本当の正解は、
ijkをいち早く作り上げてしまった上で、残りの計算結果が1になるかどうかで良いということ。
そこに気付かなかったー><
それは後日時間があればやります。
D問題は、テトリスの縦横枠があって、最初の人が5つなら5つつながっているブロックのどれかなんでもいいのを選んで、もう一人が残りを好きなピース(5つなら5つと決まっているが)で、
穴を開けずにはめられるかどうか判定せよという問題。
7つ以上だと
***
*x*
**x
という穴あき確定ピースを作れてしまうので絶対に不可能で良い。
後は6ピース以下の時の判定である。
Smallは一発で通したが、Largeは落としてしまった。
import java.util.*;
import java.io.*;
public class DSmall {
static PrintWriter pw;
public static void main(String args[]) throws Exception{
BufferedReader input = new BufferedReader(new FileReader("../GoogleCodeJam2015/io/D-large-practice.in"));
pw = new PrintWriter(new FileWriter("../GoogleCodeJam2015/io/output.txt"));
int T = Integer.parseInt(input.readLine());
for(int i = 0 ; i < T ; i++){
String[] st = input.readLine().split(" ");
int X = Integer.parseInt(st[0]);
int[] a = {Integer.parseInt(st[1]),Integer.parseInt(st[2])};
Arrays.sort(a);
if(X == 1){
pw.println("Case #"+(i+1)+": GABRIEL");
}else if(X == 2){
if((a[0] * a[1]) % 2 == 0){
pw.println("Case #"+(i+1)+": GABRIEL");
}else{
pw.println("Case #"+(i+1)+": RICHARD");
}
}else if(X >= 7){
pw.println("Case #"+(i+1)+": RICHARD");
}else if(X >= 3){
if(X == 5 && a[0] == 3 && a[1] == 5){
System.out.println(i);
pw.println("Case #"+(i+1)+": RICHARD");
}else if(a[0] >= (X / 2 + 1) && (a[0] % X == 0 || a[1] % X == 0)){
pw.println("Case #"+(i+1)+": GABRIEL");
}else{
pw.println("Case #"+(i+1)+": RICHARD");
}
}
}
pw.flush();
input.close();
pw.close();
}
}
後で聞くと、3*5で5ミノの場合、M字ピースがコーナーケースで入らないとのこと。
***
*xx
xx*
x**
***
このケースを入れて提出してみたものの、正答にならないので諦めました。
取り敢えず予選は通過です。
クロスビーツはNEXT FRONTIER -TRUE RISE-をようやく初クリア。
40回ぐらいやったんじゃないかな。
残った肉で豪勢に焼肉とかしていました。
帰宅後はCodeforces #298にちょっとだけ参戦。
A問題は、n人生徒がいるとき、隣り合う番号にならないようにできる
人数とその配置を出力せよという問題。
n=4のとき、2 4 1 3という配置ができることに気づかず、何度もミスをする。
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));
int n = Integer.parseInt(br.readLine());
if(n == 2){
System.out.println("1");
System.out.println("1");
}else if(n == 3){
System.out.println("2");
System.out.println("1 3");
}else if(n == 4){
System.out.println("4");
System.out.println("2 4 1 3");
}else{
System.out.println(n);
StringBuilder sb = new StringBuilder();
for(int i = 1 ; i <= n ; i += 2){
sb.append(i+" ");
}
for(int i = 2 ; i <= n ; i += 2){
sb.append(i+" ");
}
System.out.println(sb.substring(0,sb.length() - 1));
}
}
}
B問題から先は読まずに寝ました。仕事もあるしね…。]]>
Codeforces Round #288 (Div. 2)に参加
http://ddrer.exblog.jp/23612018/
2015-01-27T23:16:00+09:00
2015-01-30T02:30:30+09:00
2015-01-30T02:16:37+09:00
ddrer-yossi
codeforces
仕事後は、飯食ってジムへ。
有酸素運動 + 60minのつもりでしたが、
引き続きしんどさがあり、30minを2セットとなりました。いずれも10.1km/h。
ゲーセンは、TOXIC VIBRATION(H)をフルコン。
偶然にも少年A(H)をフルコン。低速地帯も等速で通った。
リフレクはGimme a Big Beat (Hommarju Remix)で95.8% AAA+
帰宅後はCodeforcesに参戦。
A問題は、N*Mの2次元平面上に、
座標を黒く塗りつぶしていく。
2*2の正方形ができてしまったら負けで、負けの瞬間のターン数を導く問題。
ただし勝ちであれば-1を返す。
最初は、塗りつぶす毎に判定すればいいかなと思いましたが、
1000*1000*100000は割に合わないし間に合わない。
どうしようどうしようと一番考えていた気がします。
結局塗りつぶした近場4箇所だけ判定すれば良いのです。
塗りつぶし箇所がoなら
xx
xo
xx
ox
xo
xx
ox
xxです。
で、角っこの条件を複雑に書いてしまって、見事にSystemTestで落ちる。
よく考えたら囲いを作る(N+2,M+2)にすることで、
複雑な条件書きを回避できることがすぐに思いついた。
つまりフィールドが
ooo
ooo
ooo
oooであれば
xxxxx
xooox
xooox
xooox
xooox
xxxxx となる。 3*4→5*6である。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int N = Integer.parseInt(s[0]);
int M = Integer.parseInt(s[1]);
int K = Integer.parseInt(s[2]);
int[] x = new int[K];
int[] y = new int[K];
for(int i = 0 ; i < K ; i++){
s = br.readLine().split(" ");
y[i] = Integer.parseInt(s[0]);
x[i] = Integer.parseInt(s[1]);
}
boolean[][] ban = new boolean[N + 2][M + 2];
int count = 0;
boolean lose = false;
for(int i = 0 ; i < K ; i++){
count++;
ban[y[i]][x[i]] = true;
if(chosa(x[i],y[i],ban)){
lose = true;
break;
}
}
if(lose){
System.out.println(count);
}else{
System.out.println("0");
}
}
public static boolean chosa(int x,int y,boolean[][] ban){
if(ban[y][x - 1] && ban[y - 1][x - 1] && ban[y - 1][x])return true;
if(ban[y - 1][x] && ban[y - 1][x + 1] && ban[y][x + 1])return true;
if(ban[y][x - 1] && ban[y + 1][x - 1] && ban[y + 1][x])return true;
if(ban[y + 1][x] && ban[y + 1][x + 1] && ban[y][x + 1])return true;
return false;
}
}
B問題は、奇数の数字を、一箇所スワップして、偶数の最大の数字にせよという問題。
つまり奇数なのは決まっているので、一番最後の桁と、その数より大きい位の高い数字があれば、
交換してしまってよい。
重要なのは、その数より大きくなくても、
偶数で位が高ければ候補に入れておく必要があり(交換の余地はある)、
下の桁でそれがあれば、入れ替えていく。
最後は文字列を結合するだけ。簡単でしょ?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
boolean ok = false;
int kouhoindex = -1;
for(int i = 0 ; i < s.length() -1 ; i++){
int num = Character.digit(s.charAt(i), 10);
if(num % 2 == 0)
if(num < Character.digit(s.charAt(s.length() - 1), 10)){
ok = true;
System.out.println(s.substring(0,i)+s.charAt(s.length() - 1)+s.substring(i + 1,s.length() - 1)+s.charAt(i));
break;
}else{
kouhoindex = i;
}
}
if(!ok){
if(kouhoindex != -1){
System.out.println(s.substring(0,kouhoindex)+s.charAt(s.length() - 1)+s.substring(kouhoindex + 1,s.length() - 1)+s.charAt(kouhoindex));
}else{
System.out.println("-1");
}
}
}
}
C問題は、ゴーストがmだけ現れて、t秒だけ光るろうそくがある。
ろうそくは1秒ごとにおける。1秒後に光り、t秒後に消滅する。
1ゴーストあたりr本のろうそくが光っている必要があるとき、必要なろうそくの本数を求めよ。
制約が300秒なので、全探索で余裕で行けると思ったので、
キューを使って書きました。配列を使って書くこともできそうですが、バグってうまくいかず。
t < rのときは、どうあがいても先にろうそくが消えてしまい、r本に到達しないのでNG。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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[] s = br.readLine().split(" ");
int m = Integer.parseInt(s[0]);
int t = Integer.parseInt(s[1]);
int r = Integer.parseInt(s[2]);
s = br.readLine().split(" ");
int[] w = new int[m];
for(int i = 0 ; i < m ; i++){
w[i] = Integer.parseInt(s[i]);
}
int num = 0;
if(t < r){
System.out.println(-1);
}else{
Queue q = new LinkedList();
for(int i = 0 ; i < w.length ; i++){
int counter = 0;
int qsize = q.size();
for(int j = 0 ; j < qsize ; j++){
int a = q.poll();
if(a >= w[i]){
q.add(a);
counter++;
}
}
for(int j = w[i] - (r - counter - 1) - 1 ; j <= w[i] - 1 ; j++){
q.add(j + t);
num++;
}
}
System.out.println(num);
}
}
}
とまあ、残念な感じでした。]]>
焼肉を焼く時、肉もまた財布を焼いているのだ Codeforces #261
http://ddrer.exblog.jp/22951647/
2014-08-16T23:03:00+09:00
2014-09-18T03:18:06+09:00
2014-09-17T16:20:10+09:00
ddrer-yossi
codeforces
夕方ごろに移動し、一旦ゲーセン。
その後は都内某所へ。無印でジム用のタオルを買いつつ、
焼肉屋で集合した。
その後は日本でも有数のものすごいPCを自宅に保持している某所へ向かい、
アルゼンチンビールで乾杯。
物に対するこだわりっぷりにものすごく惹かれました。わかる。
帰宅後はCodeforcesに参戦。
A問題は、頂点が2つ与えられているから、残りの2点を使って正方形が作れるなら
残り2点の座標を出力し、ダメなら-1を出力せよという問題。
なんか凝りすぎて結局SysTestで落ちています。
B問題は、花の美しさが与えられるので、2本ピックアップして、
差異が最も大きくなるその値を出力し、その組み合わせが何通りあるか求めよという問題。
よく考えれば間を取る必要がないので、ソートして、
最小値と最大値が一致するものがいくつあるか計算して、掛け算をする。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main2 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int[] a = new int[n];
for(int i = 0 ; i < a.length ; i++){
a[i] = Integer.parseInt(s[i]);
}
Arrays.sort(a);
int minx = a[0];
int maxx = a[n-1];
if(minx == maxx){
System.out.println("0 "+(long)n*(n-1)/2);
}else{
int index = 0;
int mincount = 0;
while(index != n){
if(a[index] == minx){
mincount++;
index++;
}else{
break;
}
}
index = n-1;
int maxcount = 0;
while(index != 0){
if(a[index] == maxx){
maxcount++;
index--;
}else{
break;
}
}
System.out.println((maxx-minx)+" "+(long)mincount*maxcount);
}
}
}
]]>
進捗なし。帰宅後即codeforces #258(div2)
http://ddrer.exblog.jp/22988220/
2014-07-24T23:37:00+09:00
2014-09-24T01:18:58+09:00
2014-09-24T01:18:58+09:00
ddrer-yossi
codeforces
お昼だけがっつり食っていました。
夜はいつもどおりジムに行き、お腹のシェイプアップを行う。
有酸素運動して、音ゲーは1クレずつやって帰宅。
そしてCodeforcesの準備。
A問題は単純に交わる点がなくなったら負けということで、
1本取り除くと、確実に縦も横も1減るので、最大値だけ見ると良い。
線が少ない方を2で割った余りが0ならば後手のMalvika、1ならば先手のAkshatの勝利。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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]);
if(Math.min(a, b) % 2 == 0){
System.out.println("Malvika");
}else{
System.out.println("Akshat");
}
}
}
B問題は、一部の配列をリバースして、単調増加列にできるかどうかという問題。
どうやったかもう忘れちゃったけど…。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] st = br.readLine().split(" ");
int[] a = new int[n];
boolean isok = true;
for(int i = 0 ; i < n ; ++i){
a[i] = Integer.parseInt(st[i]);
}
int bnum = 0;
int nownum = 0;
boolean ishen = false;
int hennum = 0;
boolean henned = false;
isok = true;
int sta = 0;
int en = 0;
for(int i = 0 ; i < n ; i++){
if(!ishen && nownum < a[i]){
nownum = a[i];
}else if(!henned && !ishen){
ishen = true;
if(i != 1)bnum = a[i-2];
hennum = a[i];
henned = true;
sta = i-1;
en = i;
}else if(ishen){
en = i;
if(a[i] < hennum){
hennum = a[i];
}else{
if(nownum < a[i]){
nownum = a[i];
ishen = false;
en = i-1;
}else{
isok = false;
break;
}
}
}else{
isok = false;
break;
}
}
if(ishen && sta != 0 && bnum > a[n-1]){
System.out.println("no");
}else if(isok){
System.out.println("yes");
System.out.println((sta+1)+" "+(en+1));
}else{
System.out.println("no");
}
}
}
]]>
タイピング大会とCodeforces #253
http://ddrer.exblog.jp/23039676/
2014-06-19T23:27:00+09:00
2014-10-01T06:55:16+09:00
2014-10-01T06:55:16+09:00
ddrer-yossi
codeforces
お昼はフォーラムの近場でラーメンを食べる。
その後はTopCoderを犠牲にして、パーティーに参加。
そしてタイピング大会は出場し、優勝しておきました。
昔とった杵柄ですな(えっ
景品お菓子だったし、リアルに要らない奴や…。金くれ金!
最後まで参加していましたが、結局抽選は当たらず。
どうでもいい同期があたっていたのでクソゲーかと思った。
帰宅前にゲーセン少々。
Flip Flap SPECIAL 97.1%
その後はCodeforcesに参加。元気だね私…。
A問題は、単純に使われている文字の種類を数え上げるだけ。
小文字しか使われないのでその辺だけ考えれば良い。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
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 s = br.readLine();
boolean[] set = new boolean[26];
for(int i = 0 ; i < s.length(); i++){
if(s.charAt(i) >= 97 && s.charAt(i) <= 122){
set[s.charAt(i) - 97] = true;
}
}
int count = 0;
for(int i = 0 ; i < set.length ; i++){
if(set[i])count++;
}
System.out.println(count);
}
}
B問題は、2nの部分文字列が、2回繰り返しになるようにする追加アルファベット数を求める問題。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
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 s = br.readLine();
int k = Integer.parseInt(br.readLine());
for(int i = 0 ; i < k ; i++){
s += "*";
}
int maxc = 0;
for(int i = 0 ; i < s.length() ; i++){
for(int j = i ; j < (s.length()-i)/2 + i ; j++){
int pre = j - i + 1;
boolean isok = true;
for(int l = i ; l < j ; l++){
if(s.charAt(l) == s.charAt(l+pre) || s.charAt(l+pre) == '*' || s.charAt(pre) == '*'){
}else{
isok = false;
break;
}
}
if(isok){
maxc = Math.max(maxc, pre);
}
}
}
System.out.println(maxc*2);
}
}
始点と終点をキメて総当りでOK。200程度なのでO(n^3)は(200^3)で間に合う。
C問題は、色のヒントもしくは数字のヒントをもらって、すべてのカードを一意に識別できる
最短を求める問題。今考えたけど実は総当りでいけるんじゃないかと。
それだけじゃダメですが。
D問題は、質問に答えてくれる確率が人によって与えられているので、
Andreyは聞くか聞かないか選べる。
その時に答えを返してくれる最大の確率を求めよという問題。
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));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
double[] nums = new double[n];
for(int i = 0 ; i < n ; i++){
nums[i] = Double.parseDouble(s[i]);
}
Arrays.sort(nums);
if(nums[n-1] >= 0.5){
System.out.println(nums[n-1]);
}else{
int index = 0;
while(index < n){
if(nums[index] < 0.5){
index++;
}else{
break;
}
}
double sumper = 0;
for(int k = 0 ; k < index ; k++){
for(int l = k ; l < index ; l++){
double sumper2 = 0;
for(int i = k ; i <= l ; i++){
double tmpsum = 1;
for(int j = k ; j <= l ; j++){
if(j == i){
tmpsum *= nums[j];
}else{
tmpsum *= (1-nums[j]);
}
}
sumper2 += tmpsum;
sumper = Math.max(sumper, sumper2);
}
}
}
System.out.println(sumper);
}
}
}
nが100程度なのでO(n^4)は1000万程度でいける。
ちなみにどれかの確率が0.5以上なら、掛けあわせで0.5より大きくなることはない
(0.5*0.5+0.5*0.5が最大)のでその値を出力する(テストケース1)
ソートして0.5より大きくなる最初のインデックスを見つける。
後はある範囲からある範囲に対して聞いて、ある範囲まで聞いてくれなくて、どこかで聞いてくれる
という計算をしたときの、最大となる確率を求めていく。
1589 -> 1725(34th、部屋内1位)でついに念願のDiv1に。これからやらなくなりそうですね…。
明日はサッカーがあるので早めに寝ます(2時半過ぎ。]]>
同期飲み Codeforces #249(div2)
http://ddrer.exblog.jp/23304181/
2014-05-30T23:03:00+09:00
2014-11-19T02:17:30+09:00
2014-11-19T02:17:30+09:00
ddrer-yossi
codeforces
明日はコードレビューというところまで。
お昼はフカヒレチャーハンとやらを大量に食べる。
夜は同期とカラオケからの鳥貴族。
酒のつまみがIPv6とか。
夜はゲーセンに知り合いが多かったですが、Codeforces #249に参加のため、離脱。
A問題は、nグループとm人乗れるバスがあり、
グループの順序は変えられない。
グループの一部が乗れないということがないように、番号の若い順番から載せるとき、
バスは何台必要かという問題。
単純に加算オーバーのときは、カウントをリセットしてインクリメントするだけ。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);
int m = Integer.parseInt(s[1]);
s = br.readLine().split(" ");
int[] a = new int[n];
for(int i = 0 ; i < n ; i++){
a[i] = Integer.parseInt(s[i]);
}
int num = 1;
int bus = m;
for(int i = 0 ; i < n ; i++){
if(a[i] > bus){
i--;
bus = m;
num++;
}else{
bus -= a[i];
}
}
System.out.println(num);
}
}
B問題は、与えられた数で、隣り合う数字をk回スワップ可能なので、
最大値がいくつになるか求めるという問題。
一番左の数と、交換できる候補を探す(候補は一番左より大きく、かつ同値であれば、より距離的に近いものを候補とする)
交換後はインデックスを1つずらす。
同じことを繰り返す、で最大値が求まる。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
StringBuilder num = new StringBuilder(s[0]);
int k = Integer.parseInt(s[1]);
int index = 0;
boolean moved = true;
while(index != num.length()){
moved = false;
int kouhoindex = index;
int kouhonum = num.charAt(index) - 48;
//System.out.println(kouhonum);
for(int i = index+1 ; i < num.length(); i++){
if(kouhonum < num.charAt(i) - 48){
if(i - index <= k){
kouhonum = num.charAt(i) - 48;
kouhoindex = i;
moved = true;
}
}
}
//System.out.println(index+","+moved+","+kouhonum);
if(moved){
num = new StringBuilder(num.substring(0, index) + String.valueOf(kouhonum) + num.substring(index,kouhoindex) + num.substring(kouhoindex+1,num.length()));
k -= kouhoindex - index;
//System.out.println(num);
}
index++;
}
System.out.println(num);
}
}
C問題は、見た目通り折れ線を出力する問題。
書き方は色々ありますが、コーナーケースには注意しましょう(最小値や最大値の取り方
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int[] a = new int[n];
for(int i = 0 ; i < n ; i++){
a[i] = Integer.parseInt(s[i]);
}
int[] kekka = new int[n+1];
int[] kekkayoko = new int[n+1];
kekka[0] = 0;
kekkayoko[0] = 0;
int sum = 0;
int max = Integer.MIN_VALUE;
int min = 0;
int tate = 0;
for(int i = 0 ; i < n ; i++){
if(i % 2 != 1){
sum += a[i];
}else{
sum -= a[i];
}
kekka[i+1] = sum;
tate += a[i];
kekkayoko[i+1] = tate;
max = Math.max(kekka[i+1], max);
min = Math.min(kekka[i+1], min);
}
int[][] kousi = new int[max-min+1][tate+1];
int start = 0;
int startyoko = 0;
for(int i = 0 ; i < a.length ; i++){
if(start < kekka[i+1]){
for(int j = startyoko ; j < kekkayoko[i+1] ; j++){
//System.out.println((max-start-(j-startyoko))+","+j+","+max+","+start+","+startyoko);
kousi[max-start-(j-startyoko)][j] = 1;
}
startyoko = kekkayoko[i+1];
start = kekka[i+1];
}else{
for(int j = startyoko ; j < kekkayoko[i+1] ; j++){
//System.out.println((max-start+j-startyoko)+","+j+","+max+","+start+","+startyoko);
kousi[max-start+j-startyoko+1][j] = 2;
}
startyoko = kekkayoko[i+1];
start = kekka[i+1];
}
}
for(int i = 1 ; i < max-min+1 ; i++){
StringBuilder sb = new StringBuilder();
for(int j = 0 ; j < tate ; j++){
if(kousi[i][j] == 0){
sb.append(" ");
}else if(kousi[i][j] == 1){
sb.append("/");
}else if(kousi[i][j] == 2){
sb.append("\\");
}
}
System.out.println(sb);
}
}
}
]]>
Codeforces #247(div2)
http://ddrer.exblog.jp/23309643/
2014-05-21T23:07:00+09:00
2014-11-20T01:24:01+09:00
2014-11-20T01:24:01+09:00
ddrer-yossi
codeforces
かなりの苦戦を強いられていた。
お昼はバリカタ醤油ラーメン。
夜はゲーセンに少し
We are Disっ娘よっつ打ち命(A) フルコン
リフレクはexamination leave 97.8%
True Blue 88.5% 微更新
DIVAはコンテストをプレー。
炉心融解EXTREME 105.06% fine5
SYMPHONIC DIVE HARD 106.06% fine 1
ミラクルペイント HARD 102.85% fine13
そいやっさぁ! HARD 105.65% fine10
ワールズエンド・ダンスホール NORMAL 105.76% fine3
*ハロー、プラネット。 NORMAL 105.00% fine11
帰宅後はコドフォ前にパラレルスペックを99%更新。
コドフォはA問題は1,2,3,4の数字にそれぞれ配点があり、数字が与えられるときの、
合計点を求めるという問題。
左からなめていって合計を求めるだけ。
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[] s = br.readLine().split(" ");
String st = br.readLine();
int[] a = new int[4];
for(int i = 0 ; i < 4 ; i++){
a[i] = Integer.parseInt(s[i]);
}
int sum = 0;
for(int i = 0 ; i < st.length(); i++){
sum += a[Character.digit(st.charAt(i), 10)-1];
}
System.out.println(sum);
}
}
B問題は、5人の人が居て、隣り合った人同士はしゃべることで幸福を得る。
並び順を変えることができるとき、その合計値を最大化したものを求めよという問題。
愚直に全部試しましょう。全部で5!通りです。
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));
int[][] grad = new int[5][5];
for(int i = 0 ; i < 5 ; i++){
String[] s = br.readLine().split(" ");
for(int j = 0 ; j < 5 ; j++){
grad[i][j] = Integer.parseInt(s[j]);
}
}
int sum = 0;
for(int i = 0 ; i < 5 ; i++){
for(int j = 0 ; j < 5 ; j++){
for(int k = 0 ; k < 5 ; k++){
for(int l = 0 ; l < 5 ; l++){
for(int m = 0 ; m < 5 ; m++){
if(i == j || i == k || i == l || i == m || j == k || j == l || j == m || k == l || k == m || l == m )continue;
int tmp = grad[i][j] + grad[j][i] + grad[k][l] + grad[l][k] + grad[j][k] + grad[k][j] + grad[l][m] + grad[m][l] + grad[l][m] + grad[m][l] + grad[k][l] + grad[l][k];
sum = Math.max(tmp, sum);
}
}
}
}
}
System.out.println(sum);
}
}
C問題は途中で眠くなって離脱しました。起きてから問題文を理解するという感じ。
すべてのノードはk個の子ノードを持ち、K個の枝にそれぞれ1,2,...kの重みがついている。
ルートを始点として末端まで通る重みが丁度nで、少なくとも1つはd以上の重みを通る
組み合わせを求めよという問題。]]>
Code-Strike予選とか
http://ddrer.exblog.jp/23326671/
2014-04-14T23:46:00+09:00
2014-11-23T10:55:54+09:00
2014-11-23T10:55:54+09:00
ddrer-yossi
codeforces
お昼は光麺。ぬるかった。
夜はゲーセン。
MARIA(I believe...)(H)フルコン
太陽の子 87.5% miss1
Codeforcesは、
A問題は、5文字以上、大文字、小文字、数字を含むパスワードであれば
Correctを返し、そうでなければToo weakを返す問題。やるだけ。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
boolean[] isok = new boolean[3];
if(str.length() < 5){
System.out.println("Too weak");
}else{
for(int i = 0 ; i < str.length(); i++){
char c = str.charAt(i);
if(48 <= c && c <= 57){
isok[0] = true;
}else if(65 <= c && c <= 90){
isok[1] = true;
}else if(97 <= c && c <= 122){
isok[2] = true;
}
}
boolean correct = true;
for(int i = 0 ; i < isok.length ; i++){
if(!isok[i]){
correct = false;
break;
}
}
if(correct){
System.out.println("Correct");
}else{
System.out.println("Too weak");
}
}
}
B問題は、
N個のプロセッサがM個の処理を時間順に行って、
プロセッサpは時刻qにメモリX[p][q]をロックする。
同じメモリを2つ以上のプロセッサがロックしようとすると、
各プロセッサはデッドロックで以降の動作をやめる。
また、以後そのメモリを触ったプロセッサも同様にそれ以降の動作をやめる。
各プロセッサはいつまで動き続けることができるか。
やるだけのはずが通らず。
C問題も簡単だったそうですが、見ずに寝ました。]]>
Codeforces #239 div2
http://ddrer.exblog.jp/23333054/
2014-03-30T23:23:00+09:00
2014-11-24T16:46:38+09:00
2014-11-24T16:43:57+09:00
ddrer-yossi
codeforces
16時からCodeforces #239 div2に参加。
A問題は、Vasyaは買い物をするのにn箇所から1つ選んでレジに並ぶ。
i番目のレジには既にki人が並んでいて、
j番目の人はmi,jの商品を持って並んでいる。
レジ打ちは1商品5秒かかって、すべて終わったら支払いで15秒かかる。
自分の番になるまでの最短秒数を求めよ。
全部のレジに関してシミュレートすればよい。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] num = new int[n];
String[] s = br.readLine().split(" ");
for(int i = 0 ; i < n ; i++){
num[i] = Integer.parseInt(s[i]);
}
int mintime = Integer.MAX_VALUE;
for(int i = 0 ; i < n ; i++){
int tmptime = 0;
String[] st = br.readLine().split(" ");
for(int j = 0 ; j < num[i] ; j++){
tmptime += Integer.parseInt(st[j])*5;
}
tmptime += num[i]*15;
mintime = Math.min(tmptime,mintime);
}
System.out.println(mintime);
}
}
B問題は、与えられたアルファベットの紙(1平方)を使って、
下のようなアルファベットのかざりになるようにしろという問題。
切っていいし、使わないものがあってもよい。
つまり、多すぎる部分は1平方でいいし、少なすぎる部分は切って全部使う。
存在しないものがある場合は問答無用で-1を返せば良い。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String e = br.readLine();
int[] num = new int[26];
int[] nume = new int[26];
for(int i = 0 ; i < s.length() ; i++){
num[s.charAt(i)-97]++;
}
for(int i = 0 ; i < e.length() ; i++){
nume[e.charAt(i)-97]++;
}
int count = 0;
for(int i = 0 ; i < num.length ; i++){
if(num[i] >= nume[i]){
count += nume[i];
}else if(num[i] == 0){
count = Integer.MAX_VALUE;
break;
}else{
count += num[i];
}
}
if(count == Integer.MAX_VALUE){
System.out.println(-1);
}else{
System.out.println(count);
}
}
}
C問題はずっとプレテストが通らず、諦めました。
内容は、
2つの整数a,bが与えられるときm
以下の条件を満たす2次元座標中の格子点3つがあれば答えよ。
3点は直角三角形を成し、直角を挟む2辺の長さはa,bである。
各辺はX軸およびY軸に平行でない。
夜は久しぶりに親と話す時間を設けました。
その後は少しゲーセン。
REVOLUTIONARY ADDICT 95.2% フルコン
弐寺DP八段67%でした。
その後は家寺。
moon_child(A)ノマゲ
]]>
6年間お疲れ様でした Codeforces #237 div2
http://ddrer.exblog.jp/23334871/
2014-03-19T23:15:00+09:00
2014-11-24T22:39:22+09:00
2014-11-24T22:39:22+09:00
ddrer-yossi
codeforces
ここまで死ぬ気でやってきたなーという感じあります。
やりきれなかったところもありますが、新たな旅立ち・・・ですね。
それが終わった後は、秋葉原のゲーセンで若干弐寺する。
渚の小悪魔押し。
MAD ATTACK DPA 易
その後は皆で打ち上げ。お疲れ様でしたーということで。
その後は幸楽苑でラーメンを食べに行く。
つけ麺で更にお腹を満たしていくスタイル。
帰宅後はCodeforces #237 div2に参加。
A問題は、n*nの二次元平面上にxの文字ができているかどうか判定する問題。
ノイズが1個でもあればダメなので、2種類の文字だけ使われているか、
×上はきちんとあるか判定する。
i == j || i == st-j-1 でいける。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import javax.print.attribute.standard.Sides;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int st = Integer.parseInt(br.readLine());
String[] s = new String[st];
for(int i = 0 ; i < st ; i++){
s[i] = br.readLine();
}
boolean isok = true;
char c = s[0].charAt(0);
char c2 = s[0].charAt(1);
if(c == c2){
isok = false;
}else{
for(int i = 0 ; i < s.length ; i++){
for(int j = 0 ; j < s[i].length() ; j++){
if(i == j || i == st-j-1){
if(c != s[i].charAt(j)){
isok = false;
break;
}
}else{
if(c2 != s[i].charAt(j)){
isok = false;
break;
}
}
}
if(!isok)break;
}
}
if(!isok){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
B問題は、
Valeraは左下座標(0,0)から始まる大きさa*aの正方形の会場を反時計回りにn*d+0.5の距離を走る
マラソンに参加し、d毎に水分補給をするために飲み物を用意しておく必要がある。
その場所の座標を出力せよ。
・反時計回りなので0,0 -> a,0 -> a,a -> 0,a で0,0戻って1周になることに注意する。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import javax.print.attribute.standard.Sides;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] st = br.readLine().split(" ");
double a = Double.parseDouble(st[0]);
double d = Double.parseDouble(st[1]);
int n = Integer.parseInt(br.readLine());
int count = 0;
int ctbk = 0;
double kyori = d;
while(count != n){
if(kyori > a){
int plus = (int)(kyori/a);
ctbk += plus;
ctbk %= 4;
kyori -= (int)(kyori/a)*a;
}else{
if(ctbk == 0){
System.out.println(kyori+" "+0);
}else if(ctbk == 1){
System.out.println(a+" "+kyori);
}else if(ctbk == 2){
System.out.println((a-kyori)+" "+a);
}else{
System.out.println(0+" "+(a-kyori));
}
kyori += d;
count++;
}
}
}
}
シミュレートして出力する。
ドリンクを置く位置は、全シミュレートで良いが、割り切れるところまでは先に計算して、
どこの周回にいるかを判定する必要がある。
C問題はグラフの復元系問題。最近流行っている…?
考える気力もなかったので解きませんでした。
明日から完全にフリーです。さあどう過ごそうか。]]>
DP八段取得! Codeforces #236
http://ddrer.exblog.jp/23341500/
2014-03-16T23:02:00+09:00
2014-11-26T06:27:23+09:00
2014-11-26T01:49:36+09:00
ddrer-yossi
codeforces
クロスビーツはLotusと逆転裁判で記録を若干更新。
自分の中でDP流行りなのでラスストの練習。
その後はリベンジのためゲーセンへ。
そして漸く…。
やりました!DP八段です!震えが止まらない。
その後はユミル(A)難
いやーいいっすね^ー^
気分がいいので、リフレクへ。
HYENA 84.0% 更新
夜は急遽誘われて夕飯を食べに行った。
牛すじ煮込み丼らしいです。
その後はDIVA。新曲とコンテストをこなす。
SING & SMILE EXTREME 102.13% fine56
おなじみの愛言葉 EXTREME 105.70% fine6 更新ではない
Ievan Polkka EXTREME 103.51% fine6 これも更新ではない
ワールズエンド・ダンスホール HARD 103.45% fine15 これは更新
愛言葉 HARD 105.93% fine2
ワールズエンド・ダンスホール NORMAL 105.82% fine2
そして愛言葉 NORMAL 105.71% fine0(ALL COOL)を取る。
ジュゲムシーケンサー NORMAL 104.92% fine7
弐寺に戻ってみる。
Ganymede(H)を等速で漸く難。
jubeatもやってました。
METROPOLIS初見93.5k
Shine On Me 99.2k
とまあ、ゲーセン三昧でした。
帰宅後はCodeforces #236(div2)に参戦。
A問題は、a個のナッツとたくさんの箱を持っている。
箱はx個の仕切りを置くと、スペースがx+1個になる。
箱のスペースをkより多くするのも嫌だが、ナッツをv個より多く入れるのも嫌である。
b個の仕切りを持っているが、なるべく箱を使う数を少なくしたい。
その時の箱の数は?
結論、詰められるだけ詰める。仕切りも使えるだけ使う。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 k = Integer.parseInt(st[0]);
int a = Integer.parseInt(st[1]);
int b = Integer.parseInt(st[2]);
int v = Integer.parseInt(st[3]);
int num = (int)Math.ceil((double)a/v);
int box = 1;
int count = 0;
while(num != 0){
if(b > 0 && count < k){
if(count != 0)b--;
count++;
}else{
box++;
count = 1;
}
num--;
}
System.out.println(box);
}
}
B問題は、木の配列があって、以下の動作が行える。
・ある木を任意の長さに伸ばす
・ある木を任意の長さに短くする
等差kで単調増加する等差数列に木を整えろという問題。
どこを始点にするかによっても結果が変わるので、全部やってみましょう。
やった上で、一番作業が少なくなるものを出力しましょう。
複数答えがある場合は、どれでも結構です。
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 n = Integer.parseInt(st[0]);
int k = Integer.parseInt(st[1]);
int[] a = new int[n];
st = br.readLine().split(" ");
for(int i = 0 ; i < n ; i++){
a[i] = Integer.parseInt(st[i]);
}
ArrayList great = new ArrayList();
int minturn = Integer.MAX_VALUE;
for(int i = 0 ; i < n ; i++){
ArrayList tmpgreat = new ArrayList();
int start = a[i];
int turn = 0;
boolean isok = true;
for(int j = 0 ; j < n ; j++){
if(i == j)continue;
if(start-(i-j)*k <= 0){
isok = false;
break;
}
if(start-(i-j)*k != a[j]){
turn++;
if(a[j] - (start-(i-j)*k) > 0){
tmpgreat.add("- "+(j+1)+" "+(a[j] - (start-(i-j)*k)));
}else{
tmpgreat.add("+ "+(j+1)+" "+((start-(i-j)*k) - a[j]));
}
}
}
if(!isok)continue;
if(turn < minturn){
minturn = turn;
great = tmpgreat;
}
}
System.out.println(minturn);
for(int i = 0 ; i < great.size(); i++){
System.out.println(great.get(i));
}
}
}
C問題は、
数N,Pが与えられる。
N点と(2N+P)辺からなるグラフを作りたい。
この時、N点中任意のK点を選ぶと、それらの間の辺が2K+P以下になるようにしたい。
そのようなグラフを答えよ。
で、でたーグラフ…と思いましたが、条件を見ると、
結局手当次第順番に張っていけばいいことに気づきます。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for(int i = 0 ; i < t ; i++){
String[] st = br.readLine().split(" ");
int n = Integer.parseInt(st[0]);
int p = Integer.parseInt(st[1]);
int number = 2*n+p;
int count = 0;
for(int j = 1 ; j < n ; j++){
for(int k = j+1 ; k <= n ; k++){
if(count == number)break;
System.out.println(j+" "+k);
count++;
}
if(count == number)break;
}
}
}
}
D問題は、
数列A(1-N)がある。また悪い素数の一覧B[i]がある。
悪い素数の一覧B[i]に含まれない素数はよい素数である。
F(x)=(xを素因数分解したときのよい素数の数)-(xを素因数分解したときの悪い素数の数) と定義する。
ここで、1≦R≦NとなるRに対し、
g=gcd(A[1]~A[R])を求め、A[1]~A[R]をgで割る、
という処理を任意回数行えるとする。
その時の最終的なF(A[i])の総和を最大化せよ。
色々考えていましたが、結局TLEで終わりました。]]>
Codeforces #234
http://ddrer.exblog.jp/23351837/
2014-03-05T23:13:00+09:00
2014-11-28T02:02:51+09:00
2014-11-28T01:52:46+09:00
ddrer-yossi
codeforces
お昼は後輩の分もおごりつつ、健康そうなラーメンを食べる。
サッカーはニュージーランド戦でした。
4-2で勝ちましたが、内容は面白くなかったですね。
その後はDDRを少々。
Butterfly 激 DP PFC
RHYTHM AND POLICE 激 DP D
その後はCodefroces #234に参加。
A問題は、XまたはOの一列12枚のカードがある。
プレイヤーはa*bで12になるようなa,bを選ぶ。
aを行、bを列として12枚のカードを並べなおして、縦一列にXが並ぶ箇所があれば勝ち。
1*12の並べ方は12列のどこかにXがあれば勝ちとなる。
全部試して出力すれば良い。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for(int i = 0 ; i < n ; i++){
StringBuilder sb = new StringBuilder();
int count = 0;
String s = br.readLine();
//System.out.println(s);
for(int j = 0 ; j < 12 ; j++){
if(s.charAt(j) == 'X'){
sb.append("1x12 ");
count++;
break;
}
}
for(int j = 0 ; j < 6 ; j++){
if(s.charAt(j) == 'X' && s.charAt(j+6) == 'X'){
sb.append("2x6 ");
count++;
break;
}
}
for(int j = 0 ; j < 4 ; j++){
if(s.charAt(j) == 'X' && s.charAt(j+4) == 'X' && s.charAt(j+8) == 'X'){
sb.append("3x4 ");
count++;
break;
}
}
for(int j = 0 ; j < 3 ; j++){
if(s.charAt(j) == 'X' && s.charAt(j+3) == 'X' && s.charAt(j+6) == 'X' && s.charAt(j+9) == 'X'){
sb.append("4x3 ");
count++;
break;
}
}
for(int j = 0 ; j < 2 ; j++){
if(s.charAt(j) == 'X' && s.charAt(j+2) == 'X' && s.charAt(j+4) == 'X' && s.charAt(j+6) == 'X' && s.charAt(j+8) == 'X'&& s.charAt(j+10) == 'X'){
sb.append("6x2 ");
count++;
break;
}
}
boolean isok = true;
for(int j = 0 ; j < 12 ; j++){
if(s.charAt(j) == 'O'){
isok = false;
break;
}
}
if(isok){
sb.append("12x1 ");
count++;
}
if(count == 0){
System.out.println("0");
}else{
System.out.println(count+" "+sb.substring(0,sb.length()-1));
}
count = 0;
}
}
}
B問題は、
n行m列の二次元があって、それぞれ'*', 'G', 'S'のどれか。
'*'は何もないセルで、'G'はロボット、'S'は飴のあるセルを示す。
一行には必ずちょうど一つずつだけ、GとSが含まれている。
ドワーフに号令をかけると、右に動き出す。
どれかのドワーフが飴を取得すると、一旦動きが止まる。
全部のドワーフが取得するには何回号令をかければよいか。
ただし取得できないドワーフがいれば-1を返せ。
ドワーフと飴の距離が何通りあるか調べる。
GがSより左にあるときは-1を返す。
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[] rs = br.readLine().split(" ");
int row = Integer.parseInt(rs[0]);
int col = Integer.parseInt(rs[1]);
int[] dwarf_x = new int[row];
int[] candy_x = new int[row];
String[] roads = new String[row];
boolean possible = true;
for(int i = 0 ; i < row ; i++){
roads[i] = br.readLine();
for(int j = 0 ; j < col ; j++){
if(roads[i].charAt(j) == 'G'){
dwarf_x[i] = j;
}else if(roads[i].charAt(j) == 'S'){
candy_x[i] = j;
}
}
if(candy_x[i] < dwarf_x[i]){
possible = false;
break;
}
}
if(!possible){
System.out.println("-1");
}else{
ArrayList list = new ArrayList();
for(int i = 0 ; i < row ; i++){
int num = candy_x[i] - dwarf_x[i];
if(!list.contains(num))list.add(num);
}
System.out.println(list.size());
}
}
}
C問題は、
n行m列のグリッドにp個キャンディが置いてあって、i番目のキャンディはx[i]行y[i]列にある。
このグリッドをx回時計回りに90度、y回水平反転を、z回半時計回りに90度回転させるとき、
操作後にそれぞれのキャンディは何行何列にあるか出力せよ。
PreTestで落ちてしまい。何度やってもダメでした。]]>
友人と飲み、Codeforces #232
http://ddrer.exblog.jp/23374661/
2014-02-26T23:08:00+09:00
2014-12-02T02:18:47+09:00
2014-12-02T02:18:47+09:00
ddrer-yossi
codeforces
TopCoder SRM610には出られませんでした。かなりショックでした。
昼間には遠出して、諸手続きを行って1万円を手に入れました。
夜は病状が回復した友人と洒落た飲み屋へ。
すず音だったかな。スパークリング日本酒で乾杯。
料金ですが、15000円だったと思います。私が1万出したかなーという。
Codeforces #232に参加。
A問題は問題文がよくわからないので勘で解いた。
解答ですが、サーバが被害に遭ったらしく、全滅です。
また暇がある時にでもやります。(2014/12/02記載)
その後は2時間ほどで帰宅して、ぷよテトへ。
レートが7807まで上がりました。大体負け知らずです。(たまにぷよぷよにやられる。
]]>
https://www.excite.co.jp/
https://www.exblog.jp/
https://ssl2.excite.co.jp/