Java教程

B1045

本文主要是介绍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的个数,尽量少用嵌套循环。

这篇关于B1045的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!