蘇州網(wǎng)站建設(shè)基礎(chǔ)型/網(wǎng)站推廣120種方法
題目總思路:
要判斷是否對稱,只需要判斷兩個(gè)放法得到的圖形是否相同(豎著放,橫著放),這兩個(gè)放法有個(gè)很重要的特性:就是數(shù)組中大于1的個(gè)數(shù),就是橫著放時(shí),第一豎排的高度。那么我們只需要比較兩個(gè)放法得到的圖形,高度是否全部一致。
方法一 :記憶性標(biāo)記
1.思路:
因?yàn)轭}目輸入是一個(gè)從大到小的序列,那么假如一個(gè)元素大于5那么他也一定大于4,利用這個(gè)特性,我們用一個(gè)變量 idx記錄,上一次遍歷到哪里,下一此接著遍歷,將個(gè)數(shù)累加即可。
2.代碼:
#include <iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int N=2e5+10;int h[N] ;
void Solved(){int n;cin>>n;for(int i=1;i<=n;i++) cin>>h[i];//cnt統(tǒng)計(jì)符合條件的元素?cái)?shù)量int idx=1, cnt=0;bool flag=true;for(int i=n;i>=1;i--){while(idx<=n&&h[idx]>=i){idx++,cnt++;}if(cnt!=h[i]) {flag=false;break;}}if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;}int main()
{int t;cin>>t;while(t--) {Solved();}return 0;
}
二 ,?方法二 :
1.思路:可以利用差分思想,因?yàn)橐粋€(gè)程度為 x的木塊,他橫著放能為這個(gè)圖形的 [1,n]這個(gè)范圍,每一個(gè)高度增加 1。
2.代碼:
#include <iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int N=2e5+10;
typedef long long ll;
int h[N] ,temp[N];
void Solved(){memset(temp,0,sizeof temp);int n;cin>>n;for(int i=1;i<=n;i++) cin>>h[i];//注意特判,不然會(huì)數(shù)組越界。if(h[1]>n){cout<<"NO"<<endl;return;}//差分思想for(int i=1;i<=n;i++){temp[1]++;temp[h[i]+1]--;}//差分?jǐn)?shù)組求前綴和for(int i=1;i<=n;i++) temp[i]+=temp[i-1];bool flag=true;for(int i=1;i<=n;i++){if(temp[i]!=h[i]){flag=false;break;}}if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;
}int main()
{int t;cin>>t;while(t--) {Solved();}return 0;
}
三,方法三·:二分找大于某個(gè)長度的元素?cái)?shù)量。
代碼:
#include <iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int N=2e5+10,M=1e9+10;
typedef long long ll;
int h[N] ,temp[N];
void Solved(){memset(temp,0,sizeof temp);int n;cin>>n;for(int i=1;i<=n;i++) cin>>h[i];bool flag=true;for(int i=n;i>=1;i--){int l=1,r=n;while(l<r){int mid=(l+r+1)>>1;if(h[mid]>=i) l=mid;else r=mid-1;}if(l!=h[i]){flag=false;break;}}if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;
}int main()
{int t;cin>>t;while(t--) {Solved();}return 0;
}