プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、python3、ラズパイなど。

競技プログラミングの基本入出力(C++)

以前、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(変数をコンソールへ)という風に覚えました。

配列に入れることも可能。C++vectorは可変長配列。

//入力
//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}

参考書