C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

初CODE FORCES

先日初めてCODE FORCESに登録してみました!(参加ではない)

div2のA問題なら解けるのでは?と前々から色々な人に言われていたのですが、
過去問をいくつか見ても解ける気がせず...先延ばしにしていた。
でもその日もお誘い頂いたので問題だけ覗いてみようと思って登録してみました。

英語は得意ではないけれど、tkwさん(部長)がgoogle翻訳かけてみて
変な所は原文を読むって言ってたのでその通りにしてみました。

問題:codeforces.com

A問題出来そうな気がしたのでコード書いてみて、次の日に提出してみたのですが…

1回目WA---問題良く読んでいなかった(勘違い)
2回目WA---入力値が同じだった場合のelse ifを書いてなかった
3回目WA---intでなくlong long intだった
4回目WA---もうイミフ

Div師匠にHelpした。
Div師匠「アルゴリズムちがうね」

そしてmin関数というのを教えて貰う。なにこれ凄い便利!!!ってなった。
最初どう使うのか解らなかったのですけど...
ansに最小値を保存して次の値と比較して更新していくのかな...って思って
↓アドバイス通りにコード書いて提出したら一発ACだった(完

#include<iostream>
#include <algorithm>
using namespace std;
int main(){
    long long int d1,d2,d3,ans=999999999999999999;
    
    cin >> d1 >> d2 >> d3;
    
    ans = min(ans,(d1 + d2)*2);
    ans = min(ans,(d2 + d3)*2);
    ans = min(ans,(d1 + d3)*2);
    ans = min(ans,d1 + d2 + d3);

    cout << ans << endl;    
   
    return 0;
}

Div師匠にコードチェックしてもらったら最大値を取る9の連続はイヤって言われる。
適当にも程がありますね...ごめんなさい(桁数も適当

そしたらバンビちゃんがこんな事を教えてくれた。
↓ long long intの最大値をそのまま変数の最大値にしてしまうという技(?)

#include<iostream>
#include <algorithm>
using namespace std;
int main(){
    // std::numeric_limits<long long int>::max() は
    //long long int 型の最大値を返す
    long long int d1,d2,d3,
    ans=std::numeric_limits<long long int>::max();
    
    cin >> d1 >> d2 >> d3;
    
    ans = min(ans,(d1 + d2)*2);
    ans = min(ans,(d2 + d3)*2);
    ans = min(ans,(d1 + d3)*2);
    ans = min(ans,d1 + d2 + d3);

    cout << ans << endl;
    cout << std::numeric_limits<long long int>::max() << endl;
   
    return 0;
}

すごいーーー。こんな事も出来るんですね、というメモを残したかったのです。
こういう知り得た事を今後もストック出来たら良いなあと思います。

因みにこの日の夜、AtCoderのABC031があったのですが、
昼間Div師匠に教わったmin関数の逆のmax関数を使ってA問題が解けた↓

#include<iostream>
#include <algorithm>
using namespace std;
int main(){
    int a,b,ans=0;
    
    cin >> a >> b;
    
    ans = max((a+1)*b,(b+1)*a);
    
    cout << ans << endl;    
   
    return 0;
}

Div師匠のおかげで圧倒的成長した1日でした(完)