5030. 核心元素(纯暴力枚举)

这题是真的不难啊,一开始没想出来,居然开三维把所有情况统统讨论了一遍,一点一点算核心元素,不超时才怪来,写这份题解警醒自己。

下面是正文。


题目链接:5030. 核心元素 - AcWing题库

给定一个长度为 n的整数数组 a1,a2,…,an,数组中的每个元素都是一个 1∼n 之间的整数。

我们规定,数组中出现次数最多的元素为数组的核心元素,例如数组 [1,1,1,2,3][1,1,1,2,3] 的核心元素为 11。

此外,如果数组中出现次数最多的元素不唯一,则出现次数最多的元素中数值最小的那个元素为数组的核心元素,例如数组 [1,2,2,3,3][1,2,2,3,3] 的核心元素为 22。

对于 1≤i≤n1的每个整数 i,请你计算有多少个给定数组的非空连续子数组的核心元素为 i。

输入格式

第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an1,2,…,。

输出格式

共一行,输出 n 个整数,其中第 i个整数表示给定数组中核心元素为 i 的非空连续子数组的数量。

数据范围

前 33 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤5000,1≤ai≤n。

 

思路:我们可以从以每一位作为子数组的开头去寻找子数组,假设以下标1为开头,那么从结尾可以定为从1~n,这样就能找到下标1开头的所有子数组。依此类推就能遍历到所有的子数组。

我们还是以下标1为开头进行讨论,去寻找每个子数组的核心元素。我们可以开一个b数组去记录每个数出现的次数(换开头的时候一定要清空数组)。如果以1为结尾,那1对应的数+1,然后判断这个数出现的次数与该子数组中的出现最多数的数量,如果比它大就赋值,记录这个数,也就是要求的核心元素,并令这个核心元素的数量+1,以此类推。

b数组的不断改变就是记录了该子数组每个数的出现次数,因为每次只有一个数会加 1 ,因此最大值可能会出现在这个被改变的数。

最后的最后,b数组一定要清空!!!!!

参考代码:

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll a[5005],b[5005],d[5005];
vector<int>g;
int main(){
	int n;
    scanf("%d", &n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++){
		fill(b+1,b+n+1,0);
		int ma=-555555,c=-55;
		for(int j=i;j<=n;j++){
			b[a[j]]++;
			if(ma<b[a[j]])ma=b[a[j]],c=a[j];
			else if(ma==b[a[j]]&&a[j]<c)c=a[j];
		d[c]++;
		    
		}
	}
	for(int i=1;i<=n;i++){
		if(i!=1)printf(" ");
		printf("%d",d[i]);
	}
	
}	

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值