以前、Python3で書きました。
s51517765.hatenadiary.jp
今回はC++です。
最近、C++の勉強を兼ねてC++で競技プログラミングの勉強をしています。
入力編
競技プログラミングでは以下のように入力が与えらるのが基本です。最初の一行は、続く入力行の回数であることが多く、二行目以降はスペース区切りが多いです。
入力は「数値」に見えても「文字列」です。
しかしC++ではそのまま数値として受け取ることができるようです。
//入力 3 6 5 1 2 2 3
#include <iostream> using namespace std; //cin, coutを使う int main() { int n , j , k; cin>>n; for (int i=0;i<n;i++) { cin>>j>>k; } }
cin
はコンソールイン(入力)だと思われます。出力はcout
コンソールアウト(出力)。
<<、>>
演算子は矢印のように見ると、cin→変数(コンソールから変数へ)、cout←ans(変数をコンソールへ)という風に覚えました。
//入力 //6 //1 2 3 4 5 6
#include <iostream> #include <vector> //可変長配列 using namespace std; int main() { int n , j; cin>>n; vector<int> input(n); //int型のinputという名前の変数を要素数nで宣言 for (int i=0;i<n;i++) { cin>>j; input[i]=j; cout<<input[i]<<endl; } }
可変長配列であるから値を追加しながら、自動的にサイズ変更できる。このときはpush_back
関数を使う。
int j; vector<int> input; //配列のサイズを宣言しなくても while(cin>>j){ //入力に値がある限り input.push_back(j); //配列の要素追加 }
このようにすると改行とスペース区切りを区別なく取得できる。
また、配列の大きさはinput.size()
で取得できる。
文字列の場合はchar
型が使える。
この場合もインデックスでアクセスできる。
char first[]="Alice"; # first[0] //"A" # first[3] //"c"
2次元配列も可能、このときは{}で囲む。
子要素の長さは不定にできないらしい。別途std::string_viewの配列にすれば出きるかも(C++17以降で使用可なのでpaizaはOKだがAtCorderは使えない)。
また、char型要素は末尾にnull文字が入るため、最大文字数+1とする必要がある。
char name[][6] = { "Alice" , "Sara" , "Ott" }; //末尾にnull文字があるためサイズは+1
競プロであえて使うメリットがあるかどうかわからないが、(C#の配列のような)静的配列はこのようになる。
int a[4]; int a={1,2,3,4}; int aa[3][4]; //2次元
出力編
cout
に続けて入力する。改行は”\n”
(""でくくる必要がある)またはendl
(End lineの略だと思う)。
cout<<"Output"<<endl; cout<<"Output"<<"\n";
複数の文字を出力するときは<<
で区切っていれる。
cout<<out[0]<<out[1]<<endl;
計算式ももちろん入力可能。
int a=2354; cout<<a/1000<<a/100%10<<a/10%10<<a%10;
おまけ
よく使うので、配列のソート。文字列の配列もソートできます(辞書順)。#include <algorithm> // a={100,50,200,400} sort(a.begin(),a.end()); // a={50,100,200,400} sort(a.begin(),a.end(),greater<int>()) //降順 // a={400,200,100,50}