hxy得到了一些卡片,這些卡片上標有數字0或5。現在她可以選擇其中一些卡片排成一列,使得排出的一列數字組成的數最大,且滿足被90整除這個條件。同時這個數不能含有前導0,即0不能作為這串數的首位。如果不能排出這樣的數,輸出「-1」。
輸入格式:
第一行,卡片的個數n。
第二行,分別給出了這n個數(只能為數字5或0)。
輸出格式:
僅一行,如果可以排出,則輸出這個數。否則輸出「-1」。
在看題時,要注意以下幾點:
卡片上只有0或者5兩個數重點分析第三點,綜合第一點,我們發現:組成的數字各個位數的和能被9整除,並且最後一位必須是0(否則不能被90整除)。hxy可以選擇一些卡片
數字最大且能被90整除
根據樣例1,0可以單獨輸出(這一點很坑人,因為題目中明確說了0不能作為這串數的首位)
我們用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,表示當前所有可能能構成是...