1030. 完美数列(25):要考虑全面

来源:互联网 发布:家庭网络布线交换机 编辑:程序博客网 时间:2024/05/18 01:40

第一次非AC代码

逻辑不够严谨

#include<iostream>#include<string>#include<algorithm>using namespace std;#define Max 100000long long arr[Max];int main(){    long long N, P;    cin>>N>>P;    int i;    for( i=0; i<N; i++ )    {        cin>>arr[i];    }    sort(arr,arr+N);    long long min=arr[0];    for( i=N-1; i>=0; i-- )    {        if( arr[i]<=min*P ){            break;        }    }    cout<<i+1<<endl;    return 0;}



第二次非AC代码

算法不够高效

#include<iostream>#include<string>#include<algorithm>using namespace std;#define Max 100000long long arr[Max];int main(){    long long N, P;    cin>>N>>P;    int i;    for( i=0; i<N; i++ )    {        cin>>arr[i];    }    sort(arr,arr+N);    long long min=arr[0];    for( i=N-1; i>=0; i-- )    {        if( arr[i]<=min*P ){            break;        }    }    cout<<i+1<<endl;    return 0;}

运行结果如下图

AC代码:

#include<iostream>#include<string>#include<algorithm>using namespace std;#define Max 100000long long arr[Max+1];int main(){    long long N, P;    int ans=1;    cin>>N>>P;    int i, j;    for( i=0; i<N; i++ )    {        cin>>arr[i];    }    sort(arr,arr+N);    for( j=0; j<N; j++ )    for( i=j+ans; i<N; i++ )    {        if( arr[i]<=arr[j]*P ){             if( i-j+1>ans )             {                 ans=i-j+1;             }        }        else            break;    }    cout<<ans<<endl;    return 0;}
原来的逻辑是 每次开始查找的范围都是从最大的元素开始 

后来的逻辑是 每次开始查找的范围随着ans的值增大不断缩减

换言之 就是我经过一次遍历后 已经确定了较大的ans值 在下一次遍历的时候我就从 j+ans 值位置开始 

类似于KMP的一步跨越尽可能多的元素个数

0 0
原创粉丝点击