極值問題(acms)

2021-09-21 16:41:13 字數 1310 閱讀 7933

【問題描述】

已知m、n為整數,且滿足下列兩個條件:

① m、n∈,即1≤m,n≤k,(1≤k≤109)。

②(n2-m*n-m2)2=1

你的任務是:程式設計輸入正整數k,求一組滿足上述兩個條件的m、n,並且使m2+n2的值最大。例如,從鍵盤輸入k=1995,則輸出:m=987   n=1597。

【輸入樣例】

【輸出樣例】

**如下:

1

long

m,n,k;

2double

delt1,delt2,n1,n2;

3 scanf("

%d",&k);

4for(m=k;m>=1;m--)

516 printf("

m=%d\nn=%d\n

",m,n);

view code

批註:該演算法確實挺好,簡潔、高效率,但是有乙個問題比較明顯,那就是當k的值達到10^9時,for迴圈內,m從k開始向1遍歷。當m的值取10^9時,計算delt的時候,m^2會溢位。而且並非只有當k達到10^9才會有這個問題,當k達到10^5時就會出現這個問題。想要自己寫乙個函式去實現高精度數的開平方根,似乎也不是這麼容易。所以,可以看看下面的遞推演算法。

標準答案是:

**如下:

1

int n=1,m=1

,k,t;

2 cin>>k;3do

411}12

while(t<=k);

13 cout<

批註:一開始閱讀該演算法,實在無法理解為何會是跟斐波那契數列一樣的規律。後來查資料,閱讀理解,終於看懂。下面做乙個記錄。

極值問題(dp)

問題描述 已知m n為整數,且滿足下列兩個條件 m n 即1 m,n k,1 k 109 n2 m n m2 2 1 你的任務是 程式設計輸入正整數k,求一組滿足上述兩個條件的m n,並且使m2 n2的值最大。例如,從鍵盤輸入k 1995,則輸出 m 987 n 1597。輸入樣例 1995 輸出樣...

筆記 RMQ區間極值問題

專題 區間最小 最大查詢 range minimum maximum query rmq問題 描述 已知長度為l的數列a,詢問區間 l,r 中的最值。若詢問的次數較少,可以用線性的複雜度來查詢,但如果詢問的次數過多且l過大,那麼複雜度就會很高。所以需要更快速的查詢方法。st演算法 預處理o nlog...

問題 B 列印極值點下標

在乙個整數陣列上,對於下標為i的整數,如果它大於所有它相鄰的整數,或者小於所有它相鄰的整數,則稱為該整數為乙個極值點,極值點的下標就是i。每個案例的輸入如下 有2 n 1行輸入 第一行是要處理的陣列的個數n 對其餘2 n行,第一行是此陣列的元素個數k 4每個案例輸出不多於n行 每行對應於相應陣列的所...