PTA乙级1045 C语言实现

博客提到运行超时问题,直接分享大佬代码。大佬采用开新数组储存顺序数,通过比较相同位置的数,只有相等时才可能是主元,整体围绕C语言相关代码展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的

#include<stdio.h>
int main(){
	int n,cnt=0,flag1,flag2,max=0,min=10000000;
	scanf("%d",&n);
	int a[n],b[n];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		if(a[i]>max)	max=a[i];
		if(a[i]<min)	min=a[i];
	}		
	for(int i=0;i<n;i++){
		if(i==0){
			if(a[i]==min)	b[cnt++]=a[i];
		}			
		else if(i==n-1){
			if(a[i]==max)	b[cnt++]=a[i];	
		}	
		else{
			flag1=0,flag2=0;
			for(int j=0;j<i;j++){
				if(a[j]>a[i]){
					flag1=-1;
					break;
				}
			}
			for(int k=i+1;k<n;k++){
				if(a[k]<a[i]){
					flag2=-1;
					break;
				}
			}
			if(flag1==0&&flag2==0)	b[cnt++]=a[i];
		}
	}
	printf("%d\n",cnt);
	for(int i=0;i<cnt;i++){
		if(i==0)	printf("%d ",b[i]);
		else	printf(" %d",b[i]);
	}
	printf("\n");
	return 0;
}

几个点运行超时
直接上大佬代码

#include<stdio.h>
#include<stdlib.h>
int main(){
	int cnt;
	scanf("%d",&cnt);
	int sp[100001][3],dp[100001];
	for(int i=0;i<cnt;i++)
		scanf("%d",&sp[i][0]);
	int leftmax=0;
	for(int i=0;i<cnt;i++){
		sp[i][1]=leftmax;
		if(sp[i][0]>leftmax)
			leftmax=sp[i][0];
	}
	int rightmin=1<<30;//<<移位符 
	for(int i=cnt-1;i>=0;i--){
		sp[i][2]=rightmin;
		if(sp[i][0]<rightmin)
			rightmin=sp[i][0];
	}
	int index=0,sum=0;
	for(int i=0;i<cnt;i++){
		int ok=1;
		if(sp[i][1]>=sp[i][0])	ok=0;
		if(sp[i][2]<=sp[i][0])	ok=0;
		if(ok){
			sum++;
			dp[index++]=sp[i][0];
		}
	}
	printf("%d\n",sum);
	for(int i=0;i<index;i++){ 
		printf("%d",dp[i]);
		if(i!=index-1)	putchar(' '); 
	}
	putchar('\n');
	return 0;
} 

还有的大佬又开一个数组储存顺序时的数,将相同位置的进行比较,只有相等时可能是主元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值