0、重点
-
判断主元的重要方法是:对原序列sort排序,逐个⽐较,当当前元素没有变化并且它左边的所有值的最⼤值都⽐它⼩的时候就可以认为它⼀定是主元。
1 3 2 4 5 //原数组 1 2 3 4 5 //排序后数组 可以看出1 4 5位置不变,是主元 但是: 5 4 3 2 1 //原数组 1 2 3 4 5 // 排序后数组 3的位置没变,但是不是主元,因为3前面有更大的,在排序时一定会变动。
所以必须满足①位置不变;②左边没有更大的数才是主元
-
当vector尺寸初始化后,可以通过
scanf("%d",&a[i]);
给vector a赋值
1、题目
2、代码
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(int argc, char **argv)
{
int v[100000]; //数组比vector更快,vector的扩展很费时间
int n,max=0,cnt=0;
scanf("%d",&n);
vector<int> a(n),b(n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]); //scanf可以给vector赋值
b[i]=a[i];
}
sort(a.begin(),a.end());
for(int i=0;i<n;i++){ //一个trick:用max保存前面最大值,这样不用每次都和前面所有的元素作比较。
if(a[i]==b[i] && b[i]>max) v[cnt++]=b[i];
if(b[i]>max) max=b[i];
}
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
if(i!=0) printf(" ");
printf("%d",v[i]);
}
printf("\n"); //按题目要求,第二行为顺序输出,当个数=0时,也要输出空行。所以个数!=0时用作换行,个数=0时用作输出空行
return 0;
}