洛谷 P2192 HXY玩卡片

2021-09-03 02:56:02 字數 1917 閱讀 3616

hxy得到了一些卡片,這些卡片上標有數字0或5。現在她可以選擇其中一些卡片排成一列,使得排出的一列數字組成的數最大,且滿足被90整除這個條件。同時這個數不能含有前導0,即0不能作為這串數的首位。如果不能排出這樣的數,輸出「-1」。

輸入格式:

第一行,卡片的個數n。

第二行,分別給出了這n個數(只能為數字5或0)。

輸出格式:

僅一行,如果可以排出,則輸出這個數。否則輸出「-1」。

在看題時,要注意以下幾點:

卡片上只有0或者5兩個數

hxy可以選擇一些卡片

數字最大且能被90整除

根據樣例1,0可以單獨輸出(這一點很坑人,因為題目中明確說了0不能作為這串數的首位)

重點分析第三點,綜合第一點,我們發現:組成的數字各個位數的和能被9整除,並且最後一位必須是0(否則不能被90整除)。

我們用five表示5的個數,zero表示0的個數,我們發現:組成的數字各個位數的和為5×five,為了保證其能被9整除,必須要保證數字中5的個數為9的倍數。

因此可以做一下討論:

zero =

=0 時,必須輸出-

1。因為這樣的數一定不能被10整出,進而不能被90整除

zero !=

0and five <

9 時,必須輸出0。

zero !=

0and five >=

9 時,輸出的5的個數為a,a為最大的滿足 a <= five,且a為9的整數倍。

最後,為了保證數字最大,很容易得到要讓5盡量排在前面。又由於0必須出現在最後一位,沒有出現衝突,所以我們很高興,只需要讓所有的5排在所有的0前面即可。

#include

int n;

intmain()

else

if(temp ==0)

}//以下判斷的分類邏輯不是很清晰,建議先看「分析」部分

if(five <

9&& zero !=0)

if((five <

9&& zero ==0)

|| zero ==0)

if(five %9==

0)for(i =

1; i <= zero; i++

)return0;

}else

for(i =

1; i <= zero; i++

)return0;

}}

pascal也來了:

var n,a,b,c,i:longint;

begin

readln

(n);

for i:

=1 to n do

begin

read

(a);

if a=

5 then inc

(b)else

inc(c)

;//統計0和5的個數

end;

if(b>=9)

and(c>=

1) then //因為只有5555555550能整除90 所以5的個數要大於9和0的個數要大於1;

begin

for i:

=1 to b div 9

dowrite

(555555555);

//節省時間

for i:

=1 to c do

write(0

);//越多0數就越大

end else

if c>=

1 then write(0

)else

write(-

1);end.

洛谷 P2192 HXY玩卡片

題目描述 hxy得到了一些卡片,這些卡片上標有數字0或5。現在她可以選擇其中一些卡片排成一列,使得排出的一列數字組成的數最大,且滿足被90整除這個條件。同時這個數不能含有前導0,即0不能作為這串數的首位。如果不能排出這樣的數,輸出 1 輸入格式 第一行,卡片的個數n。第二行,分別給出了這n個數 只能...

洛谷 P2193 HXY和序列

題目描述 hxy突發奇想,她想要找到乙個正整數序列,滿足序列中所有的數不超過n,序列長度為p,且除了第乙個數外,所有的數都能被前乙個數整除 即是前乙個數的倍數 很快她找到了乙個這樣的序列。可是她覺得還不夠,想要知道這樣的序列有多少個,可她被驚人的資料範圍嚇怕了。現在她找到了你,請你來幫助她解決這個問...

洛谷P2194HXY燒情侶

傳送門啦 這個題可以說是tarjan強連通分量的裸題,但需要維護每個強連通分量的最小值,所以做法就很明確了。我們先明確幾個陣列的意思 1.首先是tarjan縮點中的幾個陣列 dfn i i點的時間戳 low i 表示這個點以及其子孫節點連的所有點中dfn最小的值 stack,表示當前所有可能能構成是...