kotonoha_pcg@ぷろこんにっき

ここ(http://kotonoha-pcg.hatenablog.com/)の別館です、競プロの話が殆どです。最近mdモードに変えて一気に使い勝手が変わりました。

いつもの

いつものように書きます。未だに句読点を.と,に設定できていませんので、Windows機(こっちは設定できている)とメインのUbuntu(案の定時間なくて調べられてもいないし設定できてもいない)とで読みにくかったりするかもです。

AOJ 0018 Sorting Five Numbers

降順そーとするだけ。いつものようにgreater()を使う。

AOJ 0019 Factorial

最初DFSかと思って身構えていたけど、直ぐにnの値に気づいて武装解除する。for回すだけで良かったんやね…って…

AOJ 10014 Print a Chessboard

なんでこんな練習問題で20分も吸い取られたんですかね…謎だ(単に地力不足)

AOJ 0238 Time to Study

昔C使いだった頃に見て放り投げていたけどいい加減解いた。判定条件間違ったりして辛み。

#include <iostream>

using namespace std;

int main()
{
    int time=0, dt=0;
    int n=0, diff=0;
    int a,b;
    while(cin>>time){
        if(time==0) break;
        dt=0; diff=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a>>b;
            diff+=b-a;
        }
        if(diff>=time){
            cout<<"OK"<<endl;
        }else{
            dt=time-diff;
            cout<<dt<<endl;
        }
    }
    return 0;
}

きたない。

全般的にコードが汚すぎた。もっとまとめたかった(やる気なし)。レート更新されたらやる気出るんじゃない?(適当)

PCK2015予選参加記(のようで実はただの日記)

 あれから大分経って,PCK予選も終わってつらぽよがだんだん晴れてきました(要は立ち直りかけてきました).予選そのものは3完だったのですが,昨日4問目を解いたところです(5は想像付かない,6は対称の判定さえできればいけそう).なのでコード載せたいところですが,一応明日の12時頃の結果発表まで待って,その後に覚えていたら書きます,でも今更需要は無いんですけどね・・・

 ここでは感触・・・というか手ごたえ・・・というか,感じたことを感じたままに書きます.

1

 楽勝.一応ローカルテストしたけど,自明だしする意味無いでしょ,という感じだった

2

 少し考えた.条件が分からなくなったりしたので,適当に定義データを揃えるなどした.つらみが少し貯まる.

3

 楽勝.ほかの競プロerが書いてたりしたけど,突如として現れたクッソ寒いギャグで亜寒帯の大草原が目前に広がった.もう昨年のように嵌らない!!  ・・・というのは4問目で打ち砕かれました... 悲しい.でも昨年の屈辱(3問目で剰余に嵌って2時間と少しパー)は晴らせたので,やっぱり嬉しい.

4

 こ い つ が 問 題 児
ぼく 「私はこれで2時間を藻屑にしました」

教員 「簡単だよ」

ぼく 「!?!?!?!?」

という感じで辛みでした.昨日解法例を聞いて「ウッソだろこんなんwww・・・マジか」となったのは書くまでもなく.解法例は明日以降のPCK記事で書きます.

5問目以降

 解いてない

感想

 結構つらみが貯まった日だった.4問目辛み.

ALDS_1_A

ALDS 1Aやっと解けました.結果として,やっぱり最初から問題文に記載してあった擬似コードを「よく見て」書いたらよかったと思った.
 最初に大分前に書いたバブルソートと選択ソートについての記事,あれの選択ソートを参考にほぼそのまま写した結果,最終的にソートはされるけれどよく意味が分からない・・・というより,条件を満たさないコードが出来上がってしまった.ので,おとなしく擬似コードを使って書いたら,あっさりと通った.

#include <iostream>
using namespace std;
int main(){
	int n=0,a[1000]={0};
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
 for(int i=0;i<n;i++) if(i==n-1){cout<<a[i]<<endl;}else{cout<<a[i]<<" ";}

	int i,j,v,cnt;
 for(int i=1;i<n;i++){
		cnt++;
		v=a[i];
		j=i-1;
		while((j>=0)&&(a[j]>v)){
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=v;
		for(int g=0;g<n;g++){
			 
			if(g==n-1){cout<<a[g]<<endl;}else{cout<<a[g]<<" ";}
		}
	}
 return 0;
}

 このコード,最初提出したらWAになって「あれ???」となって暫く放置してたのですが,問題文読み返してるときに

for(int i=0;i<=n-1;i++)

じゃなくてこれ

for(int i=1;i<n;i++)

じゃね?
となったので書き換えたら,見事一発で通った.明らかに早まりすぎてるので,落ち着いて問題読んで適切なコードを書きたいです.


そもそもいうと,これ 選択ソートじゃなくて挿入ソートなんですよね(Insertionで気づくべきだった)...

いつもの

・・・次のコドフォ1週間後で出たら課題テストに乗り遅れそうで怖い

 あと,今の所はこんなかんじになりました(計画ではない)

まず,初めに.
 課題研究においては特に目標のようなものを決定しての取り組みというものはなかったのですが,現時点ではPCKです.が,AOJは特に他のサイトと比べても出席率が悪く,とてもではないですが発表出来るようなものではありません.そこで,以下のように計画を立てる事にしました.

1.概要

 AOJ Volume 0 を,1問辺り1時間~30分程で解くようにし,分からない問題が出てきたら,最低30分は考えてから解答を検索してコードを書く.但し,このときブログ(hatena_diary)のほうに解説解答を詳細も添えて書いていくことにする.

2.解く数
 基本的に一日一問以上・・・としてきたところ,どうしようもない現状になったので,時間が有っても無くても問題を解くことにします.具体的な解く問題数は決めないこととし,決めてもやってない現状なら,いっそ決めない方が自由にやるんじゃないかと思ってます.残りが記録時点で1ヶ月切ってるのですが,出来る限りやってみようという心意気で取り組みます.

3.その他のコンテストについて
 なにもPCKだけが全てではありません.ですが,今の所はなるべくPCKに向けての練習に取り組みたいので,特に気晴らしやコンテストが開催されるので無ければ,CFなどのコンテストやジャッジは参加しない事にします.但しこれのコンテストへの参加も一応課題研究の目的には入っているので,PCKが終わり次第,打ち込んでいく予定です.

 課題研究・・・というのは,学校の授業で,やることは読んで字の如くです.昨年はつらぽよな点数だったのですが,今年もつらぽよな点数を狙います(開き直った).コドフォとかTCとか(全く出てない)は,暇だから解こう・読もう,というのを一旦止めてAOJの過去問解きに専念しよう,というのが概要です.先に書いとくべきだった.但し時期が時期,時間も少ないので,30分考えて色々試行錯誤して駄目なら,Solutionを見ても良い事にしました.そこで止まってても時間の無駄に思えてきたので(もっと早くから取り組むべき).

CF316

 8/14(だったよね?)のCF#316について.Aは英語読めかけて開放も大体予想着いたけど,実装出来ずに無理,Bは中核になる(と思っていた)部分含む,英文読めなくて即死.

CF 316 A

 n*mの配列作ってそこに入力.別にもう一つ配列を作って,前の二次元配列の結果を入れる.解法は,n*mの内,各m回においての数値のうち最大値(複数有る場合は配列の要素数が少ない方)を選び,それを後者の配列の要素数にたいおうさせて++すればいい・・・・

というのを考えていたが,実装してなかった.後で調べてみると,STLにmax_elementなるものがあって,それを用いてコードを書いてる人が多かった.max_elementはコンテナ(配列も大丈夫そう)から最大の要素を返すようで,そこに-配列[i]するコードが多かったと思う.で,以下に実装コードを示す.

#include <bits/stdc++.h>
using namespace std;
int a[100][100],b,ans[100];
int main(){
	int n,m;
	cin>>n>>m;

	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			b=max_element(a[i],a[i]+m)-a[i];
			ans[b]++;
		}
	}
	cout<<max_element(ans,ans+m)-ans+1;
	cout<<endl;
	return 0;
}