連號區間數
阿新 • • 發佈:2019-03-20
span tdi can queue cout div algo 最小值 clu
超時,60分
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<queue> #include<map> using namespace std; int a[50005]; int temp[50005]; int main() { int n; cin>>n; for(int i=0;i<n;i++) scanf("%d",&a[i]); int ans=0; for(int i=0;i<n;i++) { int h=0; for(int j=i;j<n;j++) { if(j==i) { temp[h]=a[j]; h++; ans++; } else { temp[h]=a[j]; h++; sort(temp,temp+h); if(temp[h-1]-temp[0] == h-1) { ans++; } } } } cout<<ans; return 0; }
剪枝後80,
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<queue> #include<map> using namespace std; int a[50005]; int temp[50005]; int maxn,minn; //已經不會再出現的數中,最大的數和最小的數 int main() { int n; cin>>n; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int ans=0; for(int i=0;i<n;i++) { int h=0; maxn = minn = -1; for(int j=i;j<n;j++) { if(j==i) { temp[h]=a[j]; h++; ans++; } else { temp[h]=a[j]; h++; sort(temp,temp+h); if(temp[h-1]-temp[0] == h-1) { ans++; } //temp用來 存放從小到大排列的,可能再將來出現連續的一串數 if(temp[0]>maxn) //但是如果temp中的最小值和最大值之間,存在已經不會再出現的數 ,比如a[0],就可以break { continue; } if(temp[h-1]<minn) { continue; } break; } if(maxn == -1) maxn=i; if(minn == -1) minn=i; if(maxn < i) maxn=i; if(minn > i) minn=i; } } cout<<ans; return 0; }
連號區間數