洛谷 P8148 声海 | Sea of Voices
网课期间手痒,乱摸了一道题。其实还可以更优化,但是懒。
性质很简单。随便算下样例就出来了。。。。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define N 2500010
#define ll long long
template <class T>
inline void read(T& a){
T x = 0, s = 1;
char c = getchar();
while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
a = x * s;
return ;
}
int n;
int a[N], b[N];
map <int, int> g; // 记录每个区间和出现的次数
map <int, int> num; // b 数列中每个数字出现的次数
map <int, int> vis;
int main(){
read(n);
int nb = (n * (n + 1)) / 2;
for(int i = 1; i <= nb; i++)
read(b[i]);
sort(b + 1, b + nb + 1);
for(int i = 1; i <= nb; i++)
num[b[i]]++;
int cnt = 0;
for(int i = 1; i <= nb; i++){
if(cnt == n) break;
if(num[b[i]] > g[b[i]]){ // 有多余的,说明要加入进去
a[++cnt] = b[i];
int sum = 0;
for(int j = cnt; j; j--){
sum += a[j];
if(sum > 1e5) break;
g[sum]++;
}
}
}
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++)
printf("%d ", a[i]);
return 0;
}