1. 程式人生 > >1030. 完美數列(25):要考慮全面

1030. 完美數列(25):要考慮全面

第一次非AC程式碼

邏輯不夠嚴謹

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

#define Max 100000
long 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 100000
long 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 100000
long 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的一步跨越儘可能多的元素個數

相關推薦

1030. 完美數列(25):考慮全面

第一次非AC程式碼 邏輯不夠嚴謹 #include<iostream> #include<string> #include<algorithm> using namespace std; #define Max 100000 long

1030. 完美數列(25)

升序 blog 排列 最大 stdio.h 個數 整數 組成 clu 給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定參數p和一些正整數,請你從中選擇盡可能多的數構成一個完美數列。 輸入

1030 完美數列(25)(25 point(s))

給定一個正整數數列,和正整數,設這個數列中的最大值是,最小值是,如果,則稱這個數列是完美數列。 現在給定引數和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數N和p,其中()是輸入的正整數的個數,()是給定的引數。第二行給出個正整數,每個數

PAT乙級—1030. 完美數列(25)-native

給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數N和p,其中N(&l

1030. 完美數列(25)(C++)

給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。輸入格式:輸入第一行給出兩個正整數N和p,其中N(<= 105)是輸入的正

[PAT乙級]1030. 完美數列(25)

1030. 完美數列(25) 原題連結 給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式:

乙級 PAT 1030. 完美數列(25)

給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。輸入格式:輸入第一行給出兩個正整數N和p,其中N(<= 105)是輸入的正

PAT-乙-1030 1030 完美數列25 分)

程式碼 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int N; lon

1030 完美數列25

10的9次方 long型,注意裡面迴圈的終止條件 並且注意邊界條件,M<=mp #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int main

1030 完美數列25 分)//////

給定一個正整數數列,和正整數 p,設這個數列中的最大值是 M,最小值是 m,如果 M≤mp,則稱這個數列是完美數列。 現在給定引數 p 和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數 N 和 p,其中 N(≤10​5​​)

PAT——1030. 完美數列

for .cn 可能 i+1 array scan sta level basic 給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定參數p和一些正整數,請你從中選擇盡可能多的數構成一個完

PAT乙級 1030 完美數列

給定一個正整數數列,和正整數 p,設這個數列中的最大值是 M,最小值是 m,如果 M≤mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數 N 和 p,其中 N(≤105)是輸入的正整數的個數,

PAT (Basic Level) Practice 1030 完美數列

乙級1030 實在想不出來該怎麼在不暴力的情況下寫出這題……無奈百度,感謝原作者的思路提供,非常有幫助! PAT 乙級 1030 完美數列(分治策略思考)by csdn-FDProcess 主要是那張gif看懂了就豁然開朗 首先排序(基本) 然後以第一位數為min,再從陣列最後一

1030 完美數列

題目資訊: 給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數N和p,其中N(<=

PAT 乙級 1030 完美數列

分析題目,解題需要如下步驟 分割數列(這裡的分割時任意分割沒有必要連續) 找出分割的數列的兩個最值 判斷是否符合題目條件 若符合條件則和當前已經記錄的最大的符合條件的數列的長度比較,若大於已經記錄的長度則更新最大長度。 若還有未判斷過的數列則重複第一步,

1030 完美數列 Python實現

1030 完美數列(25)(25 分) 給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩

完美數列(25)

時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小) 題目描述 給定一個正整數數列,和正整數p,設這個數列中

PAT (Basic Level)1030. 完美數列

題目描述: 給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。 現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數N和p,其中N

PAT_B_1030 完美數列25 分)【測試點4超時】【測試點5報錯】

給定一個正整數數列,和正整數 p,設這個數列中的最大值是 M,最小值是 m,如果 M≤mp,則稱這個數列是完美數列。 現在給定引數 p 和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。 輸入格式: 輸入第一行給出兩個正整數 N 和 p,其中 N(≤10​5​​)是輸入的正整數的個

PAT B1030 完美數列25 分)

減少 %d ios lang 註意 組成 hit 感覺 color 給定一個正整數數列,和正整數 p,設這個數列中的最大值是 M,最小值是 m,如果 M≤mp,則稱這個數列是完美數列。 現在給定參數 p 和一些正整數,請你從中選擇盡可能多的數構成一個完美數列。 輸入格式: