NOIP模擬賽 等差數列

2021-08-07 23:12:30 字數 1635 閱讀 9112

題目描述

麥克在第一張紙上寫下了n個十進位制實數。然後,對於每個實數,他都寫下了乙個從0開始,以該數為公差的等差數列。比如當前數為x,則他寫的等差數列為0,x,2x,3x,……接下來,他把第一張紙上的所有在區間[a,b]中的數挑選出來,剔除掉重複的,按公升序寫在第二張紙上。但第二天,他把第一張紙弄丟了。現在,他請你根據第二張紙還原出第一張紙上的內容。 輸入

第一行包含乙個自然數k,(k<=50),表示在第二張紙上有k個數。這些數都是在區間[a,b]之間的。第二行兩個整數a和b(1<=a6)接下來k行,每行乙個實數,按公升序排列。每個數最多5位小數。 輸出

n行,每行乙個數。表示第一張紙上最開始的n個數。按公升序排列。如果有多種可能,則輸出個數最少的一種,如果還有多種,任意輸出一種即可。

樣例輸入

41 2

11.4

1.52

樣例輸出

0.5

0.7

題解:因為最多5位小數,就可以先把每個數乘上100000,輸出答案的時候再除回來,方便計算。

首先尋找所有可能合法的差值。然後逐個列舉,看在當前差值下是否可以組成合法數列。

最後檢驗每個差值是否多餘,刪去多餘的差值。

詳見**。

#include#include#includeusing namespace std;

typedef long long ll;

const int n=55;

const int m=1500;

int n;

ll a, b, num[n];

void getin( ll &shu )

map< ll, int >id;

ll d[m], dcnt, ans[n], acnt;

int way[n], cnt[n];

void find_way( ll d )

if( !*** ) return;

ans[++acnt]=d;

for( int i=1; i<=wcnt; i++ ) cnt[ way[i] ]++;

}void judge( int i, ll d )

if( !*** ) ans[i]=0;

}int main() {

scanf( "%d", &n );

getin(a); getin(b);

for( int i=1; i<=n; i++ ) {

getin( num[i] ); id[ num[i] ]=i;

for( int j=0; j

codevs等差數列

題目描述 description 給定n 1 n 100 個數,從中找出盡可能多的數使得他們能夠組成乙個等差數列.求最長的等差數列的長度.輸入描述 input description 第一行是乙個整數n,接下來一行包括了n個數,每個數的絕對值不超過10000000.輸出描述 output descr...

網易等差數列

如果乙個數列s滿足對於所有的合法的i,都有s i 1 s i d,這裡的d也可以是負數和零,我們就稱數列s為等差數列。小易現在有乙個長度為n的數列x,小易想把x變為乙個等差數列。小易允許在數列上做交換任意兩個位置的數值的操作,並且交換操作允許交換多次。但是有些數列通過交換還是不能變成等差數列,小易需...

演算法 等差數列

原理 如果乙個數列從第二項起,每一項與它的前一項的差等於同乙個常數,這個數列就叫做等差數列,這個常數叫做等差數列的公差,公差常用字母d表示。等差數列是常見數列的一種,如果乙個數列從第二項起,每一項與它的前一項的差等於同乙個常數,這個數列就叫做等差 數列,而這個常數叫做等差數列的公差,公差常用字母d表...