kengo92iの日記

プログラミングとかやったことの記録を書いていきます。

AOJ-1147 : ICPC Score Totalizer Software

とりあえず、AOJの問題を解いたプログラムを投稿していこうと思います。

Problem A: ICPC 得点集計ソフトウェア

入力を読み込んで、最大値と最小値を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;
}