題目描述麥克在第一張紙上寫下了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表...