pat-1101

由硬算超时,到找到规律的我哈哈哈~~~ 

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int inf=1000000000;
set<int>ans,temp;
int main(){
	int n;
	cin>>n;
	vector<int> a(n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		temp.insert(a[i]);
	}
	  int u=0,max=0,min[n],minn=inf;
	  fill(min,min+n,inf);
	  for(int i=n-1;i>=0;i--){
	  	if(a[i]<minn){
	  		minn=a[i];
	  		min[i]=minn;
		  }
	  }
	for(auto it=temp.begin();it!=temp.end();it++){
		if(a[u]>max) max=a[u];
		if(*it==a[u]&&max<=*it&&min[u]>=*it)
		ans.insert(*it);
		u++; 
	}
       /* for(int i=0;i<n;i++){
		int flag=0;
		for(int j=0;j<n;j++){
			if(i>=j){
				if(a[j]>a[i]) flag=1;
			}
			else{
				if(a[j]<a[i]) flag=1;
			}
		}
		if(flag==0){
			ans.insert(a[i]);
		}
	}*/ 
	printf("%d\n",ans.size());
	for(auto it=ans.begin();it!=ans.end();it++){
		if(it!=ans.begin())printf(" ");
		printf("%d",*it);
	}
	printf("\n");
	return 0;
}

总结

1.本题如果直接进行双重for循环会直接超时4个点,见我注释掉的部分,后来改进方法,如果是符合条件的,左小右大,则顺序也和set中的一样,当然这只是入门条件,还需要找出他左边的最大值,右边的最小值,当于当下元素比较,没有嵌套的for循环,由乘法变成加法,结果还有一个点格式错误,最后再加一个换行就好啦~~~

2.unorderer_set,就是省略了排序的set那还有个鸟用,map省略排序还行,毕竟map的排序确实一般用不到(没用过实话),所以如果用set,只能用set

3.格式不对时最后加个换行试试

4.事先建立最大最小值列表减少for循环嵌套好好总结一下注意边界条件

英语

无 

二刷记录  

二刷的代码几乎完全等效  但却是这样最后发现const maxn  写的10^8

题目N distinct positive integers no larger than 10​^9​​

就因为一个0 一片绿 所以以后最大值是多少就要写多少不要有侥幸心理

 

加0后 

 

//除了在最终位置上还有保证左小右大 
#include<bits/stdc++.h>
using namespace std;
vector<long long > init,ccopy;
set<long long> ans;
//const int inf=100000000;//10^9最大值少一个0都不行 
const int inf=1000000000;
int main(){
	int n;
	long long _1;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lld",&_1);
		init.push_back(_1);
	}
	ccopy=init;
	int bookmin[n],bookmax[n],mx=0,mn=inf;
	fill(bookmin,bookmin+n,inf);
	//fill(bookmax,bookmax+n,0);
	for(int i=n-1;i>=0;i--){
		if(ccopy[i]<mn){
			mn=ccopy[i];
			bookmin[i]=mn;
		}
	}
	sort(init.begin(),init.end());
	for(int i=0;i<n;i++){
		if(ccopy[i]>mx) mx=ccopy[i];
		if(init[i]==ccopy[i]&&ccopy[i]>=mx&&ccopy[i]<=bookmin[i]){//不是init  init已经排过序了应该是原序列的情况 
			ans.insert(ccopy[i]);
		}
	}
	printf("%d\n",ans.size());
    for(auto it=ans.begin();it!=ans.end();it++){
    	 if(it!=ans.begin()) printf(" ");
    	 printf("%lld",*it);
	}
	printf("\n");
	return 0;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值