アゴドリルの備忘録

小さいことを少しずつ

ABC052B Increment Decrement

Virtual Contestやったので書く

方針

問題にもある通り、sのi番目がIかDかを見て、xの値を変えていく
この際、最大値を保持する変数を1個用意してそこに最大値を保持する
(以下のコードの場合、ans)
xの値とansの値を比較してxのほうが大きい場合はansにxを代入することで最大値をとることができる

コード

#include <iostream>
#include <string>

using namespace std;

int main(){
    int n,x=0;
    string s;

    int ans=0;//最大値を保持する変数

    cin>>n>>s;

    for(int i=0;i<n;i++){
        if(s[i]=='I')x++;
        else if(s[i]=='D')x--;

        if(x>ans){//xの値が現在の最大値より大きいとき、最大値を更新する
            ans=x;
        }
    }
    cout<<ans<<endl;
    return 0;
}

ABC003B AtCoderトランプ

方針

S・Tのi番目を比較していく

  • 同じ場合→何もしない
  • 片方が@のとき、他方がa,t,c,o,d,e,rのいづれか→何もしない
  • それ以外→条件に適していない→ループを抜ける

コード

#include <iostream>
#include <string>
 
using namespace std;
 
int main(){
    bool flag=true;
 
    string s,t;
    cin>>s>>t;
 
    for(int i=0;i<s.size();i++){
        if(s[i]==t[i]){
                continue;
        }else if(s[i]=='@'){
                if(t[i]=='a'||t[i]=='t'||t[i]=='c'||t[i]=='o'||t[i]=='d'||t[i]=='e'||t[i]=='r'){
                    continue;
                }else{
                    flag=false;
                    break;
                }
        }else if(t[i]=='@'){
            if(s[i]=='a'||s[i]=='t'||s[i]=='c'||s[i]=='o'||s[i]=='d'||s[i]=='e'||s[i]=='r'){
                continue;
            }else{
                flag=false;
                break;
            }
        }else{
            flag=false;
            break;
        }
        
    }
 
    if(flag){
        cout<<"You can win"<<endl;
    }else{
        cout<<"You will lose"<<endl;
    }
}

ABC002B 罠

方針

母音を除いて出力する

注意

最後に改行を忘れないようにする

コード


#include <iostream>
#include <string>
 
using namespace std;
 
int main(){
    string s;
    cin>>s;
 
    for(int i=0;i<s.size();i++){
        if(s[i]=='a'||s[i]=='i'||s[i]=='u'||s[i]=='e'||s[i]=='o')continue;
        else cout<<s[i];
    }
    cout<<endl;
    
    return 0;
}

ABC001B 視点の確保

方針

if分を用いて場合分けしていく

注意

単位をm(メートル)かkm(キロメートル)で統一したほうがいい

コード


#include <iostream>
using namespace std;

int main(){
	int m;
	cin>>m;

	if(m<100){
		cout<<"00"<<endl;
	}else if(100<=m&&m<1000){
		cout<<0<<m/100<<endl;
	}else if(1000<=m&&m<=5000){
		cout<<m/100<<endl;
	}else if(6000<=m&&m<=30000){
		cout<<m/1000+50<<endl;
	}else if(35000<=m&&m<=70000){
		cout<<(m/1000-30)/5+80<<endl;
	}else{
		cout<<89<<endl;
	}

	return 0;
}

ctf4b 金沢 writeup

f:id:agodoriru:20161126220420p:plain

 

ctf4b 金沢 参戦してきました!!!

初めてのctf参戦

結果は910点、7問解けて26位でした!!!

 

f:id:agodoriru:20161126220421p:plain

writeupを書いてみる

Warmup(Misc,10)

提出方法の確認を兼ねているっぽい

アクセスして、フラッグが書かれているので、そのまま提出

 

てけいさん for ビギナーズ(Misc,200)

解法わからず、問題文の通り手計算で計算した

100回連続で7+3のような、四則演算をするのだが、1回ミスするとカウンターがリセットされてしまうので注意深く計算した

100回計算するとフラッグがでてくるので、それを提出

pythonでコードを書いて走らせるのが想定解らしい

 

Fix it(web,100)

講義の時に使ったchromeのdevtoolsを使う

webページにアクセスして、右クリック→検証ってやっていってNetworkタブを開いて中身を観てみると/web100/flag_is_here.phpとあるのでアクセスするとフラッグがある

 

Login as Admin(web,200)

いわゆる典型的なSQLインジェクション

nameにadmin

passにa' OR '1'='1

を入れてアクセスするとフラッグが出てくる

 

FileSystem(Forensics,100)

stringsコマンドをしてフラッグが出てきた

 

観てみよう(Forensics,200)

fileコマンドでファイルの種類を調べてみるとpcapファイルなので、wiresharkで開く

httpがあるので、follow tcp stream でctf4b{を検索するとフラッグが見つかる

 

 Welcome Reversing World!(Binary,100)

やるべきことわからず、stringsしてみたらフラッグがみつかった

 

CountUp Game(Misc,200)

本番で解けなかったけど、、、

1~3の数字を言って、21を言ってはいけないゲームを10回勝利するとフラッグがとれるっぽい

ググってみると後攻の人が先行の人の言った数の和が4になるように言えばいいらしいのでごりごり10回やればflagとれたのかなあ

 

感想

正直、初めてこういう感じで勉強会に参加するのははじめてで、びびってたけど参加すると楽しかったのでこれからは積極的にこのような勉強会に参加していきたいです

本とかステッカーもいただきました!!!

ctf4bの運営の方にはこのような勉強会を開いていただきありがとうございました

 

ミス、不適切な部分あればコメント、twitterまで連絡お願いします

 

 

 

f:id:agodoriru:20161127110015j:plain

ABC026B N重丸

問題

B: N重丸 - AtCoder Beginner Contest 026 | AtCoder

方針

①入力

②与えられるデータがソートされていない場合があるので、まず降順にソートする

③外側から塗ってくので、

外から奇数番目の円ー赤色、

外から偶数番目の円ー白色

になるので奇数番目の半径の二乗の和から偶数番目の半径の二乗の和を引くという操作を繰り返す

④その値に円周率πをかける

⑤出力

注意

c++で実装するとき、coutで出力すると許容誤差の範囲を超えてしまうので、printfで出力する

コード