题目描述
思路
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.本题最后不加回车的话有一个测试点过不了,出现格式错误
相似例题
代码
#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的个数,尽量少用嵌套循环。