白駿2108統計学
24273 ワード
しょかい
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
#define MAX_NUM 8000
int most_val(vector<int> vec, int n);
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n;
int avg, mid, most, range;
cin >> n;
vector<int> vec;
for (int i = 0; i < n; i++) {
int val;
cin >> val;
vec.push_back(val);
}
int arr[n], ans_arr[n];
int counter = 0;
int count[MAX_NUM] = {0};
sort(vec.begin(), vec.end());
avg = static_cast<int>(accumulate(vec.begin(), vec.end(), 0) / n);
mid = vec[static_cast<int> (n/2)];
most = most_val(vec, n);
range = vec.back() - vec.front();
cout << avg <<"\n";
cout << mid <<"\n";
cout << most <<"\n";
cout << range <<"\n";
}
int most_val(vector<int> vec, int n) {
int arr[n], ans_arr[n];
int max = -1;
int counter = 0;
int ans = 0;
int count[MAX_NUM] = {0};
for (int i =0; i < n; i++) {
if ((vec[i] <= 4000) || (vec[i] >= -4000))
arr[i] = vec[i];
}
for (int i = 0; i < n; i++) {
count[4000 + (arr[i])]++;
}
cout << count[8000] << "\n";
for (int i = 0; i <= 8000; i++) {
if ((count[i] == max) && (counter < 2)) {
counter += 1;
ans = i;
cout << "ans : " << ans << "\n";
} else if (count[i] > max) {
counter = 1;
max = count[i];
ans = i;
cout << count[i] << " \n";
cout << "ans2 : " << ans << "\n";
}
}
return (ans - 4000);
}
便宜上、これらの値をベクトル形式で受け入れたのは間違いです.ベクトルはカウントソートを正確に表現できません.
正しい解答
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n;
int sum = 0;
int avg, mid, most, range;
cin >> n;
int arr[n];
int count[8001] = {0};
for (int i = 0; i < n; i++) {
cin >> arr[i];
sum += arr[i]; // sum for avg
count[arr[i] + 4000]++;
}
sort(arr, arr + n);
int ans;
int max = 0;
for (int i = 0; i < 8001; i++) {
if (count[i] > max) {
max = count[i];
ans = i;
}
}
for (int i = ans + 1; i < 8001; i++) {
if (count[i] == max) {
ans = i;
break;
}
}
avg = round(double(sum) / n);
mid = arr[(n-1) / 2];
most = ans - 4000;
range = arr[n-1] - arr[0];
cout << avg <<"\n";
cout << mid <<"\n";
cout << most <<"\n";
cout << range <<"\n";
}
まずarrでこれらの値を受信してこそ、カウント処理が容易になります.カウントで最も頻繁な値を得る場合は、for文で処理するよりも、最も頻繁な値を見つけ、同じ最も頻繁な値があるかもしれないので、文を2回回転させます.
あと3回間違えて何なのか分かりませんがsumを0に初期化していないのでゴミ値が加算されて平均部分にエラーが…
Reference
この問題について(白駿2108統計学), 我々は、より多くの情報をここで見つけました https://velog.io/@blacklandbird/백준-2108-통계학テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol