読者です 読者をやめる 読者になる 読者になる

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

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

ICPC Score Totalizer Software|AOJ

ICPC Score Totalizer Software | Aizu Online Judge を解きました。

#include <bits/stdc++.h>
using namespace std;
int main(){
     
    cin.tie( 0 );
    ios::sync_with_stdio( false );
     
    while(true){
            int n;
            cin >> n;
         
            if(n == 0){ break; }
            int MAX = INT_MIN ,MIN = INT_MAX;
            vector<int> vc(n);
         
            for(int i=0; i<n; i++){
                    cin >> vc[i];
                    MAX = max(MAX, vc[i]);
                    MIN = min(MIN, vc[i]);
            }
            auto res = (accumulate(vc.begin(), vc.end(), 0)) - (MAX + MIN);
            cout << res / (n-2) << endl;
        }
        return 0;
}

↑一度目の提出。特に難しいことは無く、普通に解けました。
ACだけど、minとmaxが別々...。std::minmax_element()使えますよ!
std::minmax()を学習したばかりだし応用のチャンスでは!!(?)

#include <bits/stdc++.h>
using namespace std;
int main(){
     
    cin.tie( 0 );
    ios::sync_with_stdio( false );
     
    while(true){
        int n;
        cin >> n;
         
        if(n == 0){ break; }
        vector<int> vc(n);
         
        for(int i=0; i<n; i++){
            cin >> vc[i];
        }
        auto mm = minmax_element(vc.begin(),vc.end()); //not std::minmax()<--!!!!!
        auto res = (accumulate(vc.begin(), vc.end(), 0)) - (*mm.first + *mm.second);  //「 * 」<--!!!!!
        cout << res / (n-2) << endl;
    }
    return 0;
}

↑2回目の提出(書き直し)
「 * 」を付加するのが解らなかった故にvectorの中身を受け取れず無限時間溶かし、
その後、std::minmax_element()なのにstd::minmax()としていて、
無限に正しい結果が得られずでHP0になりました(終
そもそもイテレーターをあまり理解しておらず...。
C++ではさらっと学習はしたんですけどね。
普段問題を解くのに全然使用していなかったのでさっぱり記憶から消えていたという...。

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    cin.tie( 0 );
    ios::sync_with_stdio( false );
    
    while(true){
        int n;
        cin >> n;
        
        if(n == 0){ break; }
        vector<int> vc(n);
        
        for(int i=0; i<n; i++){
            cin >> vc[i];
        }
        sort(vc.begin(), vc.end()); // vectorの中身をsort
        auto res = (accumulate(vc.begin() + 1, vc.end() -1, 0)); // +1, -1 する
        cout << res / (n-2) << endl;
    }
    return 0;
}

↑3回目の提出(書き直し)
色々書きましたが、多分一番smartなのはsortして最小と最大値を抜いた値の総和を出す
↑この解法な気がしました...。コードも簡単だし...。
でも自分では全然思いつかなかった...最小と最大値に捉われすぎでしたね(反省)