東方の海

サブカル考察など。

AtCoder Regular Contest 048に参加しました。
A問題はそこそこな時間でできましたが、B問題で関数のスコープでてこずりかつTime Limit Exceededになってしまいだめでした。どこがそんなに処理に時間がかかるんでしょう……(>_<)

順位は330位でした。A:100 (2) 37:47で、残りは-で、合計100 (2) 47:47でした。 前回よりも善戦したんじゃないかな、かな?

さて、解説で専用ライブラリを書いているような話がありましたが、やはりコンテストで使えるようにライブラリを書いておくのはとてもアドバンテージがあるようですね。科学計算で使うときには便利なライブラリを自作していましたが、コンテスト用にも書いておこうかな……。

あと、C++って型が異様に厳しく、関数を作るときも型明示が必要(オーバーロードが可能になっている)なんですね。あと、配列の操作などでよく使う操作が一発で書けないことが多く回りくどいように感じます。C++11以降かC#に移りたい気がします。C++が人気になった頃はCが古い言語と言われることもありましたが、今はC#やC++11に対してC++が古い言語、といった感じでしょうか。最近話題のC#もそろそろC++11に対して古い言語に感じるようになるのでしょうか?

ともかく、解説でちょくだいさんがC#を使っていたのが印象的でした。

A問題
#include 
#include
#include
using namespace std;
long abs(long a)
{
if(a<0){
return -a;
}
else{
return a;
}
}
int main(){
long a,b;
cin >> a >> b;
long d = abs(a-b);
long D = a*b;
if(D<0){
cout << d-1 << endl;
}
if(D>=0){
cout << d << endl;
}
return 0;
}


B問題
#include 
using namespace std;

int rate(int a, int b){
if(a>b){
return 1;
}
if(a return 2;
}
else{
return 3;
}
}

int janken(int a, int b){
if(a==b-1 || a==b+2){
return 1;
}
if(b==a-1 || b==a+2){
return 2;
}
else{
return 3;
}
}

int main(){
int N;
cin >> N;
int R[N],H[N];
for(int i = 0; i < N; i++){
cin >> R[i] >> H[i];
}
int a[N],b[N],c[N] = {0};
for(int i = 0; i < N; i++){
for(int j = 0; j < N; i++){
if(rate(R[i],R[j])==1){
a[i] += 1;
}
if(rate(R[i],R[j])==2){
b[i] += 1;
}
if(rate(R[i],R[j])==3){
c[i] += 1;
;
}
}
cout << a[i] << " " << b[i] << " " << c[i] << endl;
}
}
スポンサーサイト
2016.03.05 23:46 | プログラミング | トラックバック(-) | コメント(0) |
AtCoderで行われたMUJINプログラミングチャレンジに参加しました!その様子をレポートしたいと思います。
ちなみに解いたときの私のプログラミング経験というと、
結構使ってたけど今は使ってない→JavaScript
ちょっと使っていた→Ruby、Python
見て書いてみたことがある→BASIC、C、C++、C#、Fortran、Java、VB
くらいで、記法としては「==」「||」「&&」「if(条件式){命令文}else{命令文}」くらいしか覚えていない状態でした。

スタートは21時で90分間したが、20:57頃にTwitterでコンテストの存在を知り、ID登録をし、スタートの5分後くらいにやっと問題を見られました。A問題は簡単だしやるか~と言ってやり始めました。B問題は有名な問題でしたが、mathの利用方法がわからないので次にやろうといった感じで、C~E問題はまず問題文の理解からして難しそうだったので飛ばしました。
まあC++が安定かなと思ってメモ帳も使わずC++で書き始めたのですが、さっそく問題発生。入出力の指定の仕方がわからないのです(問題に関するアルゴリズムは理解していた)。色々調べるもわからず、苦戦。すると、Twitterでちょくだいさんからhttp://practice.contest.atcoder.jp/のページを教えてもらいました。さっそくこのページに飛んでみると、入力は変更できないものの、提出練習ができるのと、あと全ての言語での例題の模範解答コードが載っているではありませんか!!勝利確定の瞬間です。
しかし、それを見てもやはりコンパイルエラーとなってしまいます("<< endl"を忘れていたのが原因と後に判明)。使用言語をC#に切り替えました。すると、わりとすんなりAcceptedとなり、初ACとなりました。
次に、C++でも通したいので、色々試したところ、サンプルコードと比較しながらミスと思われるところを全て推測して修正し、ACを獲得しました。
ここで残り時間が5分だったので、とりあえずB問題を見て、「あーこれ大学入試で見たことあるわー」と思いながらコードを書いていたらコンテスト終了となりました。
結果は……A:100 (3)69:02、B~E:-→100 (3)84:02でした!前後に知り合いがわんさかいた。

解説を見たけれども、AとBの方針はOK、C~Eはとても難しかったです。普通に大学入試レベル。解説ニコ生の視聴者は私と同様に初めての人もいるのに数学に関してはそこまでお手上げというわけではないようですごいなあと思いました。少なくとも私みたいに全く準備もなくその場で言語の仕様から学び(直し?)ながらやっていた人はあまりいなかったのではないでしょうか(^-^;)。

こんなのが無料でできて上位者は賞金までもらえるのかーすごい!と思いました。全問解き切るのはとても難しいとは思いますが(満点が2人いたようです)、その場で言語を覚え始めたレベルの人でも1問正解できうるというのは嬉しいですね。
あったらいいなという要望としては、AtCoderの練習ページで、「自分で設定したTest caseで」コードをテストできるページがあったらどんなに役立つだろうなあと思いました。コンテストで使われる種類のコンパイラを導入して時間やメモリ数を測定して……っていうのはとても大変なのと、各自でやるとなるとコンテストとは環境や操作がかなり異なるので……。と思って調べてみたら、Ideone.com - Online Compiler and IDE C-C++, Java, PHP, Python, Perl and 40+ other compilers and interpretersという超お役立ちサイトがありました。神っぽい。

こんな感じでした!最後に、今回書いたコードを貼っておきたいと思います(合っているかは保証しません)。継続すればきっとうまくなっていくはず(^_-)-☆終了後にB問題をやりましたが、標準だと6桁出力で、これだと誤差により約半数が誤答に。そのため7桁以上の表示にしなければならないことに気付くのにとても時間がかかりました。
A問題(C#)
using System;
class Program
{
static void Main(string[] args)
{
string c = Console.ReadLine();
if(c=="O" || c=="P" || c=="K" || c=="L"){
Console.WriteLine("Right");
}
else{
Console.WriteLine("Left");
}
}
}


A問題(C++)
#include
#include
using namespace std;
int main(){
string c;
cin >> c;
if(c=="O" || c=="P" || c=="K" || c=="L"){
cout << "Right" << endl;
}
else{
cout << "Left" << endl;
}
return 0;
}


B問題(C++)
#include
#include
#include
using namespace std;
int main(){
int a,b,c;
cin >> a >> b >> c;
int m1;
m1 = a+b+c;
int m2;
m2 = max(0,max(a,max(b,c))*2-m1);
double S = M_PI * (m1*m1-m2*m2);
cout << fixed << setprecision(7) << S << endl;
return 0;
}

MUJINプログラミングコンテストA問題
MUJINプログラミングコンテストB問題
2016.02.28 01:26 | プログラミング | トラックバック(-) | コメント(0) |