Missing Numbers(平方陣列 貪心)

2021-09-04 09:07:26 字數 2275 閱讀 6793

原題:

題意:

有乙個n(偶數)長的陣列,每乙個字首和都是乙個平方數,現在給出偶數字上的數,求原陣列。(output any)

解析:

設原陣列為,那麼a是乙個平方數,a+b是乙個平方數,a+b+c是平方數,其中b已知,a,c可自己調節,那麼如果a+b+c已經確定,則a+b越小越好,大了可以超過a+b+c的預設值了。所以可以貪心,找最小的a使a為平方數且a+b是平方數。

對於a分析:找乙個最小的平方數a,使a+b為平方數

對於c分析:已有a+b,找乙個最小的c,使a+b+c為平方數,因為c可以排程,所以問題變成找最小的大於a+b的平方數x使x+d為平方數

對於第乙個數分析,設a[1]=a^2,a[1]+a[2]=x^2,那麼a[2]=x^2-a^2=(x+a)(x-a),顯然,a[3]是可以調節的,所以a[1]+a[2]越小越好,即x^2越小越好,x=((x+a)+(x-a))/2,也就是將a[2]分成兩個數p,q的乘積,且p+q越小越好,那麼|p-q|越小越好,即將a[2]分成兩個差較小的數的乘積,那麼從a[2

]\sqrt

a[2]

​開始往下找即可。

對於第三個數分析,設m=a[1]+a[2],c=a[3],x^2=m+c,d=a[4],其中m和d已知:

c>=1,所以知道了x的下限:m+1

\sqrt

m+1​

x 2+

d=y2

d=(y

−x)(

y+x)

(y+x

)−(y

−x

)>=2

m+

1x^2+d=y^2\\d=(y-x)(y+x)\\(y+x)-(y-x)>=2\sqrt

x2+d=y

2d=(

y−x)

(y+x

)(y+

x)−(

y−x)

>=2

m+1​

也就是說,除了|p-q|需要較小以外,還需要∣p−

q∣

>=2

m+

1|p-q|>=2\sqrt

∣p−q

∣>=2

m+1​

還有,p和q是(y-x)和(y+x),所以一定是同號的,那麼d為偶數的時候,就一定是兩個偶數的乘積,那麼如果d不能整除4,一定不行。

#include

using namespace std;

#define ll long long

#define debug(i) printf("# %d\n",i)

ll a[

100009];

ll deal1

(ll val)

}else

for(i-

=i%2

;i>=

2;i-=2

)}return-1

;}ll deal

(ll m,ll val)

}else

for(i-

=i%2

;i>=

2;i-=2

)}return-1

;}intmain()

if(cant)

return0*

printf

("no\n");

a[1]

=deal1

(a[2])

;if(a[1]==

-1)return0*

printf

("no\n");

ll sum=a[1]

+a[2];

for(

int i=

3;i<=n;i+=2

) sum+

=a[i]

+a[i+1]

;}printf

("yes\n");

for(

int i=

1;i<=n;i++

)printf

("%lld%c"

,a[i]

,(i==n?

'\n'

:' '))

;}

世界是平的,網路也是平的

地點 某機房監控室 人物 值班工程師小陳 星期五的下午,窗外陽光明媚,大家都盼望順順利利地度過這週末前的半天時光。經過午休的值班工程師小陳懶散地走進了機房室,望了望監控大螢幕上的mocha network focus 網路拓撲圖,發現所有被監控的網路裝置都正常,於是他興致盎然的拿起了放在書桌上的一本...

判斷平閏年

普通版 year int input 請輸入年份 if year 4 0or year 400 0and year 100 0 年份滿足可整除四或四百但不能整除一百。print 這一年是閏年 else print 這一年是平年 可以加個while迴圈 while1 year int input 請輸...

mysql 展平各列 MYSQL 展平表查詢

我對下面的查詢有一些問題,我不確定如何修改它以給我所需的輸出,詳情如下 select listup.nodenumber as node,listup.station as extension,case when voiceserver 1 then keydescription else end ...