1048 數字加密(字首和思想)

YuKiCheng發表於2024-04-18

暴力(12分)

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
int a[100010]; 
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	set<int> st;
	for(int i=0;i<n;i++){
		if(i==0 || i==n-1){
			st.insert(a[i]);
			continue;
		}
		//左邊最大和右邊最小
		int maxleft=*max_element(a,a+i);
		int minright=*min_element(a+i+1,a+n);
		if(maxleft < a[i] && a[i] < minright){
			st.insert(a[i]);
		}
	}
    cout << st.size() << '\n';
	set<int>::iterator it;
	for(it=st.begin();it!=st.end();){
		cout << *it;
		if(++it!=st.end()){
			cout << " ";
		}
	}
	return 0;
}

靈光一動,這不字首和思想嗎?
dp記錄每個元素左邊最大和右邊最小。然後遍歷判斷一遍,時間O(n)就哦可了。
字首和(25分)

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
ll a[100010]; 
ll lMax[100010],rMin[100010];
int main(){
    int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	lMax[0]=a[0];
	for(int i=1;i<n;i++){
		lMax[i]=max(a[i-1],lMax[i-1]);
	}
	rMin[n-1]=a[n-1];
	for(int i=n-2;i>=0;i--){
		rMin[i]=min(a[i+1],rMin[i+1]);
	}
	set<ll> st;
	for(int i=0;i<n;i++){
		if(i==0){
			if(a[i]<rMin[i]){
				st.insert(a[i]);
			}
		}else if(i==n-1){
			if(a[i]>lMax[i]){
				st.insert(a[i]);
			}
		}else{
			if(a[i]>lMax[i] && a[i]<rMin[i]){
				st.insert(a[i]);
			}
		}
	}
    cout << st.size() << '\n';
    if(st.size()==0) cout << '\n';
	set<ll>::iterator it;
	for(it=st.begin();it!=st.end();){
		cout << *it;
		if(++it!=st.end()){
			cout << " ";
		}
	}
	return 0;
}

相關文章