蘇州網(wǎng)站建設(shè)基礎(chǔ)型/網(wǎng)站推廣120種方法
題目總思路:
要判斷是否對稱,只需要判斷兩個放法得到的圖形是否相同(豎著放,橫著放),這兩個放法有個很重要的特性:就是數(shù)組中大于1的個數(shù),就是橫著放時,第一豎排的高度。那么我們只需要比較兩個放法得到的圖形,高度是否全部一致。
方法一 :記憶性標記
1.思路:
因為題目輸入是一個從大到小的序列,那么假如一個元素大于5那么他也一定大于4,利用這個特性,我們用一個變量 idx記錄,上一次遍歷到哪里,下一此接著遍歷,將個數(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)計符合條件的元素數(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.思路:可以利用差分思想,因為一個程度為 x的木塊,他橫著放能為這個圖形的 [1,n]這個范圍,每一個高度增加 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];//注意特判,不然會數(shù)組越界。if(h[1]>n){cout<<"NO"<<endl;return;}//差分思想for(int i=1;i<=n;i++){temp[1]++;temp[h[i]+1]--;}//差分數(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;
}
三,方法三·:二分找大于某個長度的元素數(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;
}