ラベル C言語 の投稿を表示しています。 すべての投稿を表示
ラベル C言語 の投稿を表示しています。 すべての投稿を表示
2012/09/03

[書評]日経ソフトウエア 2012年 04月号

日経ソフトウエア 2012年 04月号 [雑誌]
日経BP社
発売日:2012-02-24
ブクログでレビューを見る»
プログラマが知っておきたい中学・高校の数学と物理、
CoffeeScriptを使ってみよう、Androidアプリ設計法、
Android4.0の新機能を学ぶ、Xcode4.2使い方入門。
付録は基礎から学ぶC言語。
日経ソフトウエア ダウンロード - 2012年:ITpro

プログラマが知っておきたい中学・高校の数学と物理

Processingを使った簡単なプログラムでスマホアプリやゲームの開発などに役立つ知識が得られる。
ProcessingはJavaベースの簡単な言語でシューティングゲーム作るのが楽という話を聞いたことがある。
数学と物理がわかっていれば短いコードで書けるので面白そうだ。こういうのを連載して欲しいかも。

JavaScriptをよりシンプルに!「CoffeeScript」を使ってみよう

CoffeeScriptで書けばJavaScriptのベストプラクティスを自動で踏襲できるという噂を聞いて興味を持ってる。
良い感じに解説されているからCoffeeScriptがどんな言語なのかわかりやすい。
カッコとか色々省略しまくってだいぶ気持ち悪く感じてしまうけど…。慣れれば大丈夫なのかな?
中括弧とかないと構造がぶっ壊れそうで怖い気がするよ。

Andriodアプリ設計法 RSSリーダー

XMLのパースとかListViewの再利用とか参考になるかも。骨格だけだから少し物足りない感じ。

Android4.0の新機能を学ぶ Android Beamを使ったお手軽通信

Android BeamはNFCの規格に従ってデバイス間通信を手軽に行うための機能だそう。
Android2.3ではAPIであったけどもAndroid4.0でOSレベルでNFCをサポートしたのがAndroid Beamだとか。
著者のわかめさんがAndroid2.3 Only Hacks ~Gingerbreadをさくさく使うためのサンプルとテクニックにNFCについて書いているらしい。
BluetoothやWi-Fi Directと比較されているので参考になる。
コードはFragmentとか色々出てきて難しそうな印象。使ってないからわからないけど。
なんか思いついたら使ってみたいけどNFCって赤外線だから用途的に使う機会無さそう。

Xcode4.2使い方入門

ストーリーボードの使い方について。Segueの設定方法とか。
この連載まとめれば下手な入門書いらないわー。使い方レベルで困ることがない。

おまけ

インターン女子C#を学ぶがだいぶ百合っぽくなってまいりました。
ちゃんと学んだことないから結構参考になってるけどね。
付録「現代プログラマの常識!基礎から学ぶC言語」はプラグラミング初めてレベルから
構造体やポインタへと一気にインフレする内容になっててビックリした。これでできたらすごい。

日経 ソフトウエア 2012年 04月号 [雑誌]
日経 ソフトウエア 2012年 04月号 [雑誌]
2012/06/12

[競技プログラミング][C言語][AtCoder]さかさま辞書

B - さかさま辞書

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君は友達とチャットで逆さしりとりをすることにしました。
逆さしりとりとは、前の人が言った単語の頭文字で終わる単語を答えるしりとりです。
しかし、高橋君は英単語に自信がないのでこっそり「さかさま辞書」を使うことにしました。

普通の辞書は単語の先頭の文字がABC順になるように並べられており、
同じ文字同士の場合はその次の文字がABC順になるように並べられます。
先頭から見ていく普通の辞書順に対して、「さかさま辞書」は後ろの文字から見ていきます。
例えば apple, bee, card は、普通の辞書なら apple → bee → card の順になります。
しかし、「さかさま辞書」では d で終わる card が 1 番、
apple とbee は同じ e で終わるのでその 1 つ前が e である bee が 2 番、l であるapple が 3 番の順になります。

図(a):普通の辞書順に並べた例  図(b):さかさま辞書順に並べた例

高橋君の代わりに「さかさま辞書」を作成し、与えられた単語を「さかさま辞書」順に並べてください。

入力

入力は以下の形式で標準入力から与えられる。
N
s1
s2
:
:
sN
1 行目は、並べる単語数を表す整数 N(1≦N≦100) が与えられる。
2 行目から N 行は、並べる単語を表す文字列が 1 行に 1 つずつ与えられる。
i+1 行目の文字列 si の長さは 1 文字以上 20 文字以下で、含まれる文字はアルファベットの小文字のみ(a-z)です。
なお、重複する単語が与えられることはありません。

出力

入力として与えられた単語を、さかさま辞書順に標準出力に 1 行ずつ出力せよ。
なお、最後には改行を出力せよ。

出典

B: さかさま辞書 - AtCoder Regular Contest #003 | AtCoder

回答

AtCoder/arc003_2.cpp at master · wada811/AtCoder
配列の中身の文字列を逆順にしてソートしてもう一回逆順にして戻して表示すればOK。
流石に同じ配列内でやるのは面倒なので反転用の配列を用意した。
PHPを始めたから関数名がPHPっぽくなってる。
main関数だけ見るとロジックだけ書かれてて日が経っても把握しやすくて良いなぁと思った。
2012/06/11

[競技プログラミング][C言語][AtCoder]GPA計算

A - GPA計算

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君はアメリカに留学しようと考えており、成績表を提出することになりました。
アメリカ留学の成績表には、学力を測る指標であるGPAを表記する必要があります。
GPAとは各単位に対する評価(A,B,C,D,F)を点数に換算して平均した値で、点数への換算は以下のようになります。
A評価 → 4 点
B評価 → 3 点
C評価 → 2 点
D評価 → 1 点
F評価 → 0 点
全てF評価だった場合は、GPAは 0 になります。
高橋君の各単位に対する評価をもとにGPAを求めなさい。

入力

入力は以下の形式で標準入力から与えられる。
N
r1r2…rN
1 行目は、単位の総数を表す整数 N(1≦N≦100) が与えられる。
2 行目には、単位に対する評価を表す N 文字の文字列が与えられる。
i 文字目の文字 ri は A, B, C, D, F のいずれかである。

出力

入力として与えられた単位の評価をもとにしたGPAを標準出力に 1 行で出力せよ。
誤差は絶対誤差あるいは相対誤差の少なくとも片方が 1e^−9 以下であれば許容する。(1e^−9=10^−9)
なお、最後には改行を出力せよ。

出典

A: GPA計算 - AtCoder Regular Contest #003 | AtCoder

回答

AtCoder/arc003_1.cpp at master · wada811/AtCoder · GitHub
アスキー文字の差分取ってswitch文でbreakしないで流すのは上手いことやったと思ったわー
例題の精度ミスと変換修飾子の良い指定の仕方の模索に時間を喰った記憶がある。
double型で小数点以下に0が続く場合にその0を省いて表示するにはgをつければ良い。
普段使わないからこれを見つけるのに一番時間かかった。
2012/06/10

[競技プログラミング][C言語][AtCoder][ふか杯]流れ

C - 流れ

時間制限 : 2sec / スタック制限 : 8MB / メモリ制限 : 64MB

Description

w*hのグリッドがある.

グリッド上のおのおののマスには,高さが設定されている.

今,いくつかのマスの上から液体を注ぐ.

あるマスの上に液体が存在し,そのマスの高さよりもそこから隣接するマスの高さの方が低いとき,
液体は隣接するマスへ広がっていく.ただし,グリッド上の2つのマスは辺を共有するときに隣接していると見なす.

液体が広がるマスの個数を求めよ.

Input

入力は複数のテストケースからなる. 入力の終わりは,3つの0のみを含んだ行で示される.
各テストケースは,以下の形式で与えられる.

w h p
z00 z01 … z0(w−1)
z10 z11 … z1(w−1)

z(h−1)0 z(h−1)1 … z(h−1)(w−1)
x1 y1

xp yp
1≦w,h≦20
0≦p≦wh
0≦zij≦100
0≦xi<w
0≦yi<h
テストケースの1行目には,3つの整数w,h,pが書かれている.
w,hはそれぞれグリッドの横幅と縦幅を表し,pは液体を注ぐ回数を表す.

続くh行には,それぞれw個の整数zijが書かれている. zijは(j,i)のマスの高さを表す.

続くp行にはそれぞれ2個の整数xi,yiが書かれている. xi,yiは(xi,yi)のマスに液体を注ぐことを示す.

ただしすでに液体を注いだマスにもう一度液体を注ぐこともある.

テストケースの数は1つのファイルにつき20個以下であることが保証されている.

Output

各テストケースに対して,液体が広がるマスの個数を1行に出力せよ.

出典

C: 流れ - ふか杯 5th Contest | AtCoder

回答


AtCoder/fuka5_3.cpp at master · wada811/AtCoder
実は通ってない…。
Submission #17715 - ふか杯 5th Contest | AtCoder
サンプルのテストケースは通るけど他のテストケースが通らなくてわからなくて詰んだ。
というかサンプルがどうしてその結果になるの理解できなかった。
注いだ場所は高さが上がるのか…?
5 4 5 5 5
5 3 5 1 5
5 2 1 2 5
5 3 5 3 5
5 5 5 5 5
の(0, 0)に注いだら
5 5 5 5 5
5 4 5 1 5
5 3 2 2 5
5 3 5 3 5
5 5 5 5 5
になって、ここまでで4回。そこで(2, 2)に注いだらどうなるのか。
真ん中の2より低いところがないので広がらないから出力は4なんじゃないかと思うけど5なんだよなぁ。
よくわからないので分かる人はコメントしてくれると嬉しいです。
2012/06/08

[競技プログラミング][C言語][AtCoder][ふか杯]すべては1になる

B - すべては1になる

時間制限 : 2sec / スタック制限 : 8MB / メモリ制限 : 64MB

Description

O氏は長い間ずっと大学に閉じ込められていたが,
自分の後継となる者Fを見つけ後の事を全てそのFにたくし,n年の時を経て外の世界に旅立つことにした.(0は自然数)

大学から外の世界に出るためには,まず大学を卒業しなければならない.
なんと,O氏はこの事を事前に想定し,一定時間がたつと自動的に
O氏が卒業したことにするプログラムを大学のコンピュータに埋め込んでいたのだ.
しかし,仕込んだ日時は記録しているのだが
プログラムを仕込んだのがずいぶん昔なため卒業する正確な時刻を忘れてしまった.
仕込んだプログラムを見てみると,仕込んだ時刻から2進数で111....11秒後に発動する設定になっていた.

O氏は周りの人に不審に思われないように卒業するために,仕込んだプログラムが発動する時刻を計算することにした.

(この問題では,閏秒はないものとして考えること)

Input

入力は複数のテストケースからなる.入力の終わりは1つの0のみを含んだ行で示される.
各テストケースは以下の形式で与えられる.

year/month/day hh:mm:ss
time
1900≦year≦20012
01≦month≦12
01≦day≦31
00≦hh≦23
00≦mm,ss≦59
テストケースの1行目には,年,月,日,時間,分,秒が書かれている.
これらはO氏がプログラムを仕込んだ時刻を表している.
月,日,時間,分,秒は必ず2桁で与えられる.(値が10未満の場合,10の位は0埋めされる)

テストケースの2行目には,1のみから成る文字列timeが書かれている.
これはプログラムが発動するまでの時間を2進数で表したものである.timeの長さは1文字以上30文字以下である.

存在しない日付は与えられないことが保証されている.
テストケースの数は1つのファイルにつき5,000個以下であることが保証されている.

Output

各テストケースに対して,プログラムが発動する時刻を入力と同じ形式で1行に出力せよ.

出典

B: すべては1になる - ふか杯 5th Contest | AtCoder

回答

AtCoder/fuka5_2.cpp at master · wada811/AtCoder · GitHub

とりあえず全部秒に直して発動までの時間を足せばいいじゃないってことで
mktime関数で変換して計算した。
出力がサンプルインプット・アウトプットで間違っていたのになぜか通ったような気がする…。
2012/06/07

[競技プログラミング][C言語][AtCoder][ふか杯]単位

A - 単位

時間制限 : 2sec / スタック制限 : 8MB / メモリ制限 : 64MB

Description

今学期あなたは,k単位以上取得できなければ,留年してしまうことが分かった.
なんとしてもそれは避けたいので,n個の講義の中からいくつか選んで,k単位を取得したいと思う.

事前の調査によって,各講義で単位を取得するために最低限必要な出席回数が分かった.
学校などできるだけ行きたくないので,k単位以上取得するために必要な最小の出席回数を求めよう.

Input

入力は複数のテストケースからなる.入力の終わりは2つの0のみを含んだ行で示される.
各テストケースは以下の形式で与えられる.

n k
x1…xn
1≦n≦100
1≦k≦n
0≦xi≦100
テストケースの1行目には,2つの整数n, kが書かれている.nは講義の数を表し,kは必要な単位の数を表す.

テストケースの2行目には,n個の整数xiが書かれている.xiはi番目の授業の単位を修得するのに必要な出席回数を表す.

各講義で取得できる単位数は,すべて1単位である.
テストケースの数は1つのファイルにつき1,000個以下であることが保証されている.

Output

各テストケースに対して,最低限出席しなければならない回数を1行で出力せよ.

出典

A: 単位 - ふか杯 5th Contest | AtCoder

回答

AtCoder/fuka5_1.cpp at master · wada811/AtCoder · GitHub

ソートして k まで合計すれば必要最小限の出席回数になる。
2012/06/04

[競技プログラミング][GREE Programming Challenge]カードのシャッフル

GREE Programming Challenge

概要

・グリーのエンジニアに応募してみたいが、応募前に自分の実力を試してみたい。
・地方に住んでいるので面接回数が少ない方がありがたい。
・面接は苦手だがプログラミングには自信がある。
GREE Programming Challengeは、このような方々のご要望にお応えするために作られた新しい採用プログラムです。
プログラミングスキルを評価する1次面接をパスできますので効率的な転職活動を行って頂けます。
もちろん学生の皆さんのチャレンジもお待ちしております。

チャレンジ方法

制限時間内に与えられた問題を解決するプログラムを書いてください。
一定の基準をクリアした方については、弊社人事担当から面接のご連絡をさせて頂きます。
※ただし、あなたの書いたコードが他人のコードに酷似していた場合、
あなただけでなく、酷似していた方についても失格とさせて頂きますので、問題の管理は厳重にお願いします。
もう採用は終了しているみたいなので記事書く。

カードのシャッフル(配点:30点)

N枚のカードをシャッフルするアルゴリズムを以下のように定義する。

1) カードをまずK個の山に均等に分ける。
2) 一つ目の山には、元のカードの最下部にあった「N/K枚」を順番を変えずにそのまま使う。
3) 二つ目の山には、元のカードの最下部から2番目にあたる「N/K枚」の塊を順番を変えずに使う。以下同様。
4) これでK個の山が出来たので、次にシャッフルに移る。
まず一つ目の山の一番上にあるカードを取って、シャッフル結果の山の1枚目のカードとなるようにする。
さらに二つ目の山の一番上にあるカードを取って、シャッフル結果の山の2枚目のカードとなるようにする。
全ての山の一番上のカードを使った後は一つ目の山に戻り、
一つ目の山で現在一番上になっているカードを取ってシャッフル結果の山の(K+1)枚目のカードとする。
次に、二つ目の山で現在1枚目になっているカードを取ってシャッフル結果の山の(K+2)枚目のカードする。以下同様。

例えば、N=6 で K=3 だった場合、元のカードの順番が上から下に「ABCDEF」となっていたとすると、
上記アルゴリズムを1回実行した結果は「ECAFDB」となる。

入力されたNとKの値を元にシャッフルを何度も繰り返した時に、
カードの順番が元のカードの順番と再び同じになるために必要な最低限のシャッフル回数を求め、
色々なNとKの値の組み合わせを連続してテストできるようにしたプログラムを書け。

入力値は以下のようにプログラムに入力されるものとする:
・1行目には、行われるテストの数Tが入力される。
・次に続くT行には、NとKの二つの整数が入力される。

出力結果

・T行の結果が出力される。各行には、各テストにおいて元の順番に戻るまでに必要な最小シャッフル回数が表示される。
もし元の順番に戻ることが決して無い場合は、-1が出力される。

条件

・Kは常にNの約数
・T <= 10000 ・2 <= K <= N <= 10^9

出典

GREE Programming Challenge / カードのシャッフル | Interview Street Challenges

考え方

Case: n = 6, k = 3
index:  0 1 2 3 4 5
cards:  A B/C D/E F
shuffle
result: E C A/F D B
index:  4 2 0/5 3 1

ここで、n / k == 2, n - n / k == 4 なので、
for(i = 0; i < n / k; i++)
for(j = n - n / k; j >= 0; j -= n / k)
でシャッフルできる。

解答

/* Enter your code here. Read input from STDIN. Print output to STDOUT */
#include <stdio.h>
#define MAX 100000000

int cards[MAX], temp[MAX];
int count;

int check(int n){
    int i;
    for(i = 0; i < n; i++){
        if(cards[i] != i){
            return 1;
        }
    }
    return 0;
}

void shuffle(int n, int k){
    int i, j, l;
    i = 0;
    for(j = 0; j < n / k; j++){
        for(l = n - n / k; l >= 0; l -= n / k){
            temp[i++] = cards[j + l];
        }
    }
    for(i = 0; i < n;  i++){
        cards[i] = temp[i];
    }
    
    if(check(n)){
        count++;
        shuffle(n, k);
    }
}

int main(){
    int num;
    int n, k;
    int i, j;
    
    scanf("%d", &num);
    for(i = 0; i < num; i++){
        scanf("%d %d", &n, &k);
        for(j = 0; j < n; j++){
            cards[j] = j;
        }
        count = 1;
        shuffle(n, k);
        printf("%d\n", count);
    }

    return 0;
}
なんか面白そうなことやっているのでチャレンジしてみた。
文章が長くてパッと見なにやるのか把握するのに時間がかかったけど
簡単にいえば山を分割して後ろの山から順に先頭のカードを取るだけ。
シャッフルのアルゴリズムに少し悩んだけど(n, k) = (6, 3), (6, 2)を考えたら法則が見えた。
カードの中身が何であるかは問われていないので適当に数字入れてチェックもそれで。
あとはシャッフル関数を再帰呼び出ししてカウントすればOK。
しかしもう採用が終わったからなのかわからないけど投稿してもアウトプットに出力されない。
せっかくやったのになー。

早くまともにPHPで標準入出力できないと毎回C言語で書かなきゃならんので覚えよう…!

2012/05/30

[競技プログラミング][C言語][AOJ0009]Prime Number

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0009&lang=jp

Prime Number

6 桁以下の正の整数 n を入力し、n 以下の素数がいくつあるかを出力するプログラムを作成して下さい。
ただし、素数とは 1 と自分自身でしか割り切れない正の整数のうち 1 をのぞいたものをいいます。
例えば 10 以下の素数は、2, 3, 5, 7 です。

Input

複数のデータセットが与えられます。各データセットに n が1行に与えられます。入力の最後まで処理して下さい。

Output

各データセットごとに、n 以下の素数の個数を1行に出力して下さい。
回答:AOJ/vol0/AOJ0009.cpp at master · wada811/AOJ
与えられた整数まで自前で素数判定してカウントすると頑張って高速化しても通らない悲劇…。
どうやら素数判定にはエラストテネスのふるいというものを使うらしい。
これを知らずに自力で頑張って上手くいかなくて半日潰れて泣いた。素数もうやだ…。
そしてこれからのAOJの問題が知ってるかどうかになってきたので萎えてきた。
いい加減C言語でやり続けるのも辛いし、
AOJをひたすら解き続けるのも面白くないのでココで一旦AOJは止めます。

同じ競技プログラミングのAtCoderは2週間に一回くらいなので続けるつもり。
言語は多分C言語ではなくなると思う。
Javascriptを学びたいけど直近の課題としてPHPがあるのでPHPでゴニョゴニョしてるかも。
2012/05/29

[競技プログラミング][C言語][AOJ0008]Sum of 4 Integers

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0008&lang=jp

Sum of 4 Integers

50 以下の正の整数 n を入力し、0 ~ 9 の範囲の整数 a, b, c, d の組で
a + b + c + d = n
を満たすものの組み合わせ数を出力するプログラムを作成して下さい。

例えば、n が 35 のとき、(a, b, c, d) は
(8,9,9,9)、(9,8,9,9)、(9,9,8,9)、(9,9,9,8) の 4 通りですので、答えは 4 となります。

Input

複数のデータセットが与えられます。
各データセットに n が1行に与えられます。入力の最後まで処理して下さい。

Output

各データセットごとに、a, b, c, d の組み合わせ個数を1行に出力して下さい。
回答:AOJ/vol0/AOJ0008.cpp at master · wada811/AOJ
超手抜き4重ループ。
コンピュータの計算が速いからやり方は気にしなくてもなんとかなるという…。

それではまた明日。
2012/05/28

[競技プログラミング][C言語][AOJ0007]Debt Hell

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0007&lang=jp

Debt Hell

某国に住んでいる友達がお金に困って、
あるヤミ金融業者から 10 万円の借金をしたまま、全く返済していないといいます。
この業者は、一週間ごとに 5% の利子を借金に加え、さらに借金の 1,000 円未満を切り上げます。

n を入力したとき、n 週間後の借金の残高を出力し終了するプログラムを作成して下さい。n は 100 以下とします。

Input

整数 n

Output

n 週間後の返済額

回答:AOJ/vol0/AOJ0007.cpp at master · wada811/AOJ
借金地獄ということで複利計算を行えば良い。
利率をかけ続けながら切り上げる。
切り上げするなら天井関数(ceil関数)使っても良かったかも。
2012/05/25

[競技プログラミング][C言語][AOJ0006]Reverse Sequence

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0006&lang=jp

Reverse Sequence

文字列 str を入力したとき、その文字列を逆順に出力するプログラムを作成して下さい。
文字は半角英数字のみで、20 文字以内とします。

Input

文字列 str

Output

str の逆順
回答:AOJ/vol0/AOJ0006.cpp at master · wada811/AOJ
一文字ずつ配列に突っ込んで逆順に取り出すだけー

それではまた明日。
2012/05/24

[競技プログラミング][C言語][AOJ0005]GCD and LCM

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0005&lang=jp

GCD and LCM

20億以下の正の整数 a, b を入力したとき、
a と b の最大公約数と最小公倍数を出力して終了するプログラムを作成して下さい。
ただし、a と b の最小公倍数は 20 億を超えないものとします。

Input

複数のデータセットが与えられます。
各データセットは1行に a と b が1つのスペースで区切られて与えられます。
入力の最後まで処理して下さい。

Output

各データセットに対して、最大公約数と最小公倍数を1つのスペースで区切って1行に出力して下さい。
回答:AOJ/vol0/AOJ0005.cpp at master · wada811/AOJ · GitHub

GCD( greatest common divisor:最大公約数)最大公約数 - Wikipedia
LCM( least common multiple:最小公倍数)最小公倍数 - Wikipedia
ユークリッドの互除法 - Wikipedia
基礎知識としては以上の3つ。
GCDをユークリッドの互除法で求めて、LCM = a * b / GCD でLCMを求める。

ユークリッドの互除法のアルゴリズムはこちら↓が参考になった。
最大公約数を求める2つのアルゴリズムを書いてみた - sh-2の日記
他にもGCDを求める方法はあるみたいだけどわかりやすさでユークリッドの互除法が一番かな。

20億とか言われて面食らった。データ型の最大値を覚えていないので調べると long で大丈夫らしい。
C言語講座:色々なデータ型の最大値、最小値
LCMを求める時に上の式で計算すると一時的に long の最大値すら超えるので先にGCDで割る必要がある。

それではまた明日。
2012/05/23

[競技プログラミング][C言語][AOJ0004]Simultaneous Equation

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0004&lang=jp

Simultaneous Equation

連立方程式
ax + by = c
dx + ey = f
の解、x, y を出力して終了するプログラムを作成して下さい。
a, b, c, d, e, f はそれぞれ、 -1000 以上 1000 以下の実数とし、
連立方程式の解が一意に存在するように与えれれるものとします。

Input

複数のデータセットが与えられます。入力の最後まで処理して下さい。
1つのデータセットが1行に与えられます。
1つのデータセットに a, b, c, d, e, f が1つのスペースで区切られて与えられます。

Output

各データセットに対して、x, y を1つのスペースで区切って1行に出力して下さい。
各値は小数点以下第3位まで出力して下さい。小数点以下第4位を四捨五入して下さい。
回答:AOJ/vol0/AOJ0004.cpp at master · wada811/AOJ
行列の凄さは教えられないことが多いけど
プログラムがこのように連立方程式を計算するのに役立つって事を教えればいいのに。

fabs()で-0を0に直さないと通らないので注意。fabs()について→abs/labs/fabs関数

それではまた明日。
2012/05/22

[競技プログラミング][C言語][AOJ0003]Is it a Right Triangle?

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0003&lang=jp

Is it a Right Triangle?

1000 以下の3つの正の整数を入力し、
それぞれの長さを3辺とする三角形が直角三角形である場合には YES を、
違う場合には NO と出力して終了するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。1行目にデータセット数 N が与えられます。
続いて N 行の入力が与えれます。各行に3つの整数が1つのスペースで区切られて与えられます。

Output

各データセットごとに、YES または NO を1行に出力して下さい。
回答:AOJ/vol0/AOJ0003.cpp at master · wada811/AOJ
スワップして三平方の定理で判定するだけの簡単なプログラム。

それではまた明日。
2012/05/21

[競技プログラミング][C言語][AOJ0002]Digit Number

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0002&lang=jp

Digit Number

与えられた2つの整数 a と b の和の桁数を出力して終了するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。各データセットは1行に与えられます。
各データセットは2つの整数 a と b が1つのスペースで区切られて与えられます。
入力の終わりまで処理して下さい。a と b は非負の整数とします。

Output

各データセットごとに、a + b の桁数を出力して下さい。
回答:AOJ/vol0/AOJ0002.cpp at master · wada811/AOJ
久しぶりにC言語やると忘れがちなのが、scanfで読み取れる限りwhileループで処理する方法。
while(scanf("%d %d", &a, &b) != EOF){
}
というかいい加減C言語もツライし他の言語で標準入出力できるようにならないと。
Javaで標準入出力覚えちゃうのが一番早いんだろうなー。
AOJがD言語も使えるようになってたから覚えとくと色々広がりそう(読者層的な意味で)
2012/05/19

[競技プログラミング][C言語][AOJ0001]List of Top 3 Hills

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0001&lang=jp

List of Top 3 Hills

山や丘の高さをメートル単位で 1 から 10,000 までの範囲の整数で表した 10 個のデータがあります。
その 10 個のデータを読み込んで、その中で、高い順から3つ出力して終了するプログラムを作成して下さい。

Input

山の高さ1(整数) 
山の高さ2(整数) 
.
.
山の高さ10(整数) 

Output

最も高い山の高さ
2番目に高い山の高さ
3番目に高い山の高さ
回答:AOJ/vol0/AOJ0001.cpp at master · wada811/AOJ · GitHub
これもバブルソートで高いのを取ってくるだけ。
プログラミングの宝箱 アルゴリズムとデータ構造を参考にバブルソートの書き方を変えた。
int i;
int height[10];
int temp, flag;

do{
    flag = 0;
    for(i = 0; i < 9; i++){
        if(height[i] > height[i + 1]){
            flag = 1;
            temp = height[i + 1];
            height[i + 1] = height[i];
            height[i] = temp;
        }
    }
}while(flag);
ネットのそこいらで見たのを真似して書いたのよりコッチのほうが効率が良かったので次からはこの書き方で書く。
2012/05/13

[競技プログラミング][C言語][AtCoder]コマンド入力

C - コマンド入力

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君は友達と格闘ゲームで対戦をすることにしました。
格闘ゲームは A, B, X, Y の 4 種類のボタンを連続で入力するコマンドにより技を繰り出し戦うゲームです。
しかし、普段格闘ゲームで遊ばない高橋君にとってコマンドの入力は難しく、友達に勝てそうにありません。
そこで余っている L と R のボタンに連続した 2 つのボタン入力を
ショートカットとして割り当てることで、コマンドの入力を短縮したいと思います。
例えば、コマンドが ABXY だと 4 回ボタンを入力する必要がありますが、
L に AB、R に XY を割り当てることで LR の 2 回のボタン入力に短縮できます。
L と R を用いて入力をなるべく短くした時に必要なボタンの入力回数を求めなさい。

入力

入力は以下の形式で標準入力から与えられる。
N
c1c2…cN
1 行目にコマンドに必要なボタンの入力回数を表す N(1≦N≦1000)が与えられる。
2 行目にコマンドの内容を表す N 文字の文字列が与えられる。
i 文字目の文字である ci は、A, B, X, Y のいずれかで与えられる。

出力

ショートカットを用いてコマンド入力に必要なボタンの入力回数を最小化したときの、
ボタン入力回数を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

C: コマンド入力 - AtCoder Regular Contest #002 | AtCoder

回答

AtCoder/arc002_3.cpp at master · wada811/AtCoder

総当りでクリアってのが美しくないかなー。
アルゴリズム的なのを期待したけど解読できる回答はみんな総当りでなんかなー。
とりあえず次は総当たりでもなんでも時間内にC問題までクリアしたいところ。
2012/05/04

[競技プログラミング][C言語][AOJ0000]QQ

AIZU ONLINE JUDGE http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0000&lang=jp

QQ

以下のような表記で、九九を出力して終了するプログラムを作成して下さい。
(×記号の代わりに、小文字の x を使用すること)

1x1=1
1x2=2
.
.
9x8=72
9x9=81

Input

なし

Output

1x1=1
1x2=2
.
.
9x8=72
9x9=81
回答:AOJ/vol0/AOJ0000.cpp at master · wada811/AOJ · GitHub
ただの二重ループ。
vol100の最後より簡単で拍子抜けだった。

それでは。
2012/05/03

[競技プログラミング][C言語][AtCoder]割り切れる日付

B - 割り切れる日付

時間制限 : 2sec / スタックサイズの制限 : 10MB / メモリー制限 : 64MB

問題文

高橋君は割り切れる日付が好きです。
割り切れる日付とは、年÷月÷日の計算結果が整数になる日付のことです。
例えば今日の日付は 2012 年 5 月 2 日ですが、
2012÷5÷2=201.2 となり整数ではないので、今日の日付は割り切れる日付ではありません。

高橋君は割り切れる日付が好きでたまらないので、
次の割り切れる日付を心待ちにして、毎日今日が割り切れる日付かどうかをチェックしてしまいます。
彼に少しでも多くの仕事をしてもらうために、
入力として与えられた日付以降で最初に来る割り切れる日付を求めなさい。
ただし、入力として与えられた日付が割り切れる日付だった場合は、与えられた日付が答えになります。

入力

入力は以下の形式で標準入力から与えられる。
Y⁄M⁄D
グレゴリオ暦(現在、日本で一般的に使われている暦)に従って
年を表す Y、月を表す M、日を表す D が / で区切られて 1 行で与えられる。
Y は 4 桁、M と D は 0 埋めされた 2 桁の整数である
(M と D は、1 桁の数の場合も 1 桁目に 0 をつけて 2 桁にする)。
与えられる日付は 1000⁄01⁄01 以降、2999⁄12⁄31 以前とする。

出力

入力として与えられた日付以降で最初に割り切れる日付を、入力と同じ形式で標準出力に 1 行で出力せよ。
ただし、入力として与えられた日付が割り切れる日付だった場合は、入力と同じ日付を出力すること。
なお、最後には改行を出力せよ。

出典

割り切れる日付 - AtCoder Regular Contest #002 | アットコーダー

回答

AtCoder/arc002_2.cpp at master · wada811/AtCoder

A問題でやった閏年判定を活用して各月の日数の配列の2月の値をインクリメント。
16行目は yaer % (month * day) == 0 にすると処理時間が伸びるのであえてこの形。
25行目はいらないんだけど、外すと何故か使用メモリが大きくなるので書いてある。
別にそんなにシビアなわけじゃないけど他の問題は出来なかったし、
取り組むつもりがないのでB問題をこだわってみた。
2012/05/02

[競技プログラミング][C言語][AtCoder]うるう年

A - うるう年

時間制限 : 2sec / スタックサイズの制限 : 10MB / メモリー制限 : 64MB

問題文

高橋君は忘れっぽい性格なので、うるう年は 2 月 29 日の存在を毎回忘れてしまいます。
そこで、自動でうるう年かどうかをコンピュータに教えてもらえるようにしたいと思います。
入力として与えられた年がうるう年かそうでないかを判断しなさい。

ただし、うるう年は以下の規則で決定します。
規則 1:4 で割り切れる年はうるう年である。
規則 2:100 で割り切れる年をうるう年ではない。
規則 3:400 で割り切れる年はうるう年である。
規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。
ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。
例えば、2000 年は規則 3 を満たすのでうるう年です。
2100 年は規則 2 を満たしますが、規則 3 を満たさないのでうるう年ではありません。

入力

入力は以下の形式で標準入力から与えられる。
Y
年を表す整数 Y(1000≦Y≦2999) が 1 行で与えられる。

出力

与えられた年がうるう年ならば YES、そうでなければ NO を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

うるう年 - AtCoder Regular Contest #002 | アットコーダー

回答

AtCoder/arc002_1.cpp at master · wada811/AtCoder · GitHub

閏年の判定は何回かやったからすぐにできた。判定部分はコピペしてきたけど。
この問題は次のB問題で使うための小問みたいな感じだった。

タグ(RSS)