B1045

题目描述

B1045

思路

1.前面最大的数<=主元素<=后面最小的数
2.找出所有位置的后面的最小的数,放入数组中,方便后续查找
3.找出前面最大的数,如果该数比前面最大的数小,则该数一定不是主元素

代码

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	int a[100000];
	int num=0;	//可能的主元个数 
	int ans[10000];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	int max=a[0];
	int right_min[100000]={0};
	right_min[n-1]=a[n-1];
	right_min[n-2]=a[n-1];
	//找出每个元素右边最大的元素
	for(int i=n-3;i>=0;i--) 
	{
		if(a[i+1]<right_min[i+1])
		{
			right_min[i]=a[i+1];
		}
		else
		{
			right_min[i]=right_min[i+1];
		}
		//printf("%d %d\n",a[i],right_min[i]);
	}
	
	
	for(int i=0;i<n;i++)
	{
		//找出a[i]左边最大的数
		if(a[i]>=max)
		{
			max=a[i];
			//
			if(a[i]<=right_min[i])
		 	{
		 		//printf("*%d\n",a[i]);
		 		ans[num]=a[i];
		 		num++;
			}
		 } 

		 
	}
	sort(ans,ans+num);
	
	printf("%d\n ",num);
	for(int i=0;i<num;i++)
	{
		if(i==0)
		{
			printf("%d",ans[i]);
		}
		else
		{
			printf(" %d",ans[i]);
		}
	}
	printf("\n");
	
	return 0;
}

注意事项

1.使用sort()函数时不仅要加algorithm头文件还要加using namespace std;
2.本题最后不加回车的话有一个测试点过不了,出现格式错误

相似例题

B1040

代码

#include<stdio.h> 
#include<string.h>
#define MAX 100000
#define MOD 1000000007
char a[MAX];

int main()
{
	gets(a);
	//统计每一个位置左边p的个数;
	int left_p[MAX]={0};
	int n=strlen(a);

	for(int i=0;i<n;i++) 
	{
		//printf("%c-->",a[i]);
		if(i>0)
		{
			left_p[i]=left_p[i-1];
		} 
		if(a[i]=='P') 
		{
			left_p[i]+=1;
		}
		//printf("%d\n",left_p[i]);
	}
	
	

	int total_PAT=0;
	int right_T=0;
	
	for(int i=n-1;i>=0;i--)
	{
		if(a[i]=='T')
		{
			right_T++;
		}
		if(a[i]=='A')
		{
			total_PAT=(total_PAT+left_p[i]*right_T)%MOD;
		}
	}
	
	printf("%d",(total_PAT%MOD));
	return 0;
}

注意事项
1.及时取模(在倒数第三个语句中要及时取模),否则在最后才取模的话会造成误差,导致结果错误。
2.思路精巧,统计A左边的P的个数和右边T的个数,用乘积得出PAT的个数,尽量少用嵌套循环。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值