AOJ-1147 : ICPC Score Totalizer Software
とりあえず、AOJの問題を解いたプログラムを投稿していこうと思います。
入力を読み込んで、最大値と最小値を1つずつ削除
同じ値が複数ある場合は1つだけ削除する
最終的に値の平均値を出力して終了
多分、ICPCの問題で一番簡単な問題
//http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1147&lang=jp #include<iostream> #include<map> #include<vector> #include<algorithm> #include<cmath> #include<climits> #include<ctime> #include<cstring> #include<numeric> #define ALL(v) (v).begin(),(v).end() #define REP(i,p,n) for(int i=p;i<(int)(n);++i) #define rep(i,n) REP(i,0,n) #define dump(a) (cerr << #a << "=" << (a) << endl) #define DUMP(list) cout << "{ "; for(auto nth : list){ cout << nth << " "; } cout << "}" << endl; using namespace std; int main() { int N; while(cin >> N && N) { vector<int> score(N,0); rep(i, N){ cin >> score[i]; } int max_s = *max_element(ALL(score)); int min_s = *min_element(ALL(score)); rep(i,N){if(score[i]==max_s){score.erase(score.begin()+i);break;}} rep(i,N){if(score[i]==min_s){score.erase(score.begin()+i);break;}} int ave = accumulate(ALL(score),0) / score.size(); cout << ave << endl; } return 0; }
それぞれ、最大、最小値を1つ消す作業を入れているけど、
わざわざそれぞれの値を削除しなくても、ソートすれば、始めと最後を飛ばして
計算すればいいだけになり、以下のプログラムになる。
int main() { int N; while(cin >> N && N) { vector<int> score(N,0); rep(i,N){ cin >> score[i]; } sort(ALL(score)); int ave = accumulate(score.begin()+1, score.begin()+N-1, 0) / (N-2); cout << ave << endl; } return 0; }