부분집합은 DFS 써서 구했고, 은근 소수점 처리가 관건일지도 모르겠다.
20자리까지 출력하되 뒤에 붙은 0은 제거해야 한다.
열심히 서치한 결과 cout
으로 printf
의 %g
효과를 내는 친구를 찾았다.
그것은 바로 defaultfloat
.
fixed
는 후행의 0을 포함하여 소수점 이하 자릿수를
setprecision(n)
만큼 강제로 유지하는 반면
defaultfloat
은 후행의 0을 자동 제거하여 필요한 만큼만 표시한다.
오랜만에 dfs
쓰느라고 머리 좀 썼다.
기억이 너무 빨리 사라지는 것 같아 안타까웠다,, (내 뇌 한정)
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int t, n, ans;
vector<int> arr, v;
vector<double> avg;
void dfs(int lev) {
if (lev >= n) {
if (!v.empty()) {
double sum = 0;
for (int i = 0; i < v.size(); i++) sum += v[i];
avg.push_back(sum / v.size());
}
}
else {
v.push_back(arr[lev]);
dfs(lev + 1);
v.pop_back();
dfs(lev + 1);
}
}
int main() {
cin >> t;
for (int i = 1; i <= t; i++) {
cin >> n;
arr.resize(n);
avg.clear();
for (int j = 0; j < n; j++) cin >> arr[j];
dfs(0);
double sum = 0;
for (double x : avg) sum += x;
double ans = sum / avg.size();
cout << "#" << i << " " << setprecision(20) << defaultfloat << ans << "\n";
}
return 0;
}
D4 어려운데