1. 程式人生 > >連號區間數

連號區間數

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; }

連號區間數