洛谷 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;
}



posted @ 2022-02-18 10:36  雪之下,树之旁  阅读(39)  评论(0编辑  收藏  举报