JoyOI1012 NOIP2008火柴棒等式

2021-08-22 03:18:30 字數 3116 閱讀 6741

時間限制

記憶體限制

評測方式

題目**

1000ms

131072kib

標準比較器

local

noip2023年提高組第二題

給你n根火柴棍,你可以拼出多少個形如「a+b=c」的等式?等式中的a、b、c是用火柴棍拼出的整數(若該數非零,則最高位不能是0)。用火柴棍拼數字0-9的拼法如圖所示:

注意:1. 加號與等號各自需要兩根火柴棍

2. 如果a≠b,則a+b=c與b+a=c視為不同的等式(a、b、c>=0)

3. n根火柴棍必須全部用上

輸入檔案matches.in共一行,又乙個整數n(n<=24)。

輸出檔案matches.out共一行,表示能拼成的不同等式的數目。

【輸入輸出樣例1解釋】

2個等式為0+1=1和1+0=1。

【輸入輸出樣例2解釋】

9個等式為:

0+4=4

0+11=11

1+10=11

2+2=4

2+7=9

4+0=4

7+2=9

10+1=11

11+0=11

輸入樣例 #1

輸出樣例 #1

【輸入樣例1】 

14【輸入樣例2】

18

【輸出樣例1】 

2【輸出樣例2】

9

【問題描述】

給你n根火柴棍,你可以拼出多少個形如「a+b=c」的等式?等式中的a、b、c是用火柴棍拼出的整數(若該數非零,則最高位不能是0)。用火柴棍拼數字0-9的拼法如圖所示:

注意:1. 加號與等號各自需要兩根火柴棍

2. 如果a≠b,則a+b=c與b+a=c視為不同的等式(a、b、c>=0)

3. n根火柴棍必須全部用上

【輸入】

輸入檔案matches.in共一行,又乙個整數n(n<=24)。

【輸出】

輸出檔案matches.out共一行,表示能拼成的不同等式的數目。

【輸入輸出樣例1】

matches.in

matches.out

【輸入輸出樣例1解釋】

2個等式為0+1=1和1+0=1。

【輸入輸出樣例2】

matches.in

matches.out

解題報告

【問題簡述】給n根火柴棒,問能拼出多少種形如「a+b=c」的等式。

【題目型別】列舉或者搜尋

【解題分析】題目中給定n<=24,除去等號和加號要用的4個外還有20個火柴棒可以擺放。初始化讀入n時可以減去4,剩下就是兩個加數所需要的火柴棒數目。

procedure init;

begin

readln(n);

dec(n,4); {除掉『=』和『+』的4根火柴}

end;

和與加數中較大的乙個數字數相同或者大一。理想情況下11111和11111,可是另乙個加數為0也有6個火柴棒的花費,4個「1」的情況也不可能,所以和列舉到「1111」就可以了。(事實證明也是如此的,因為1比其他字母少用很多火柴),時間效率已經完全可以承受了。

具體操作時,先列舉和,在列舉其中乙個加數,另乙個加數可以用和減去列舉的加數得到。

for i:=0 to 1111 do //列舉和

for j:=0 to i do   //列舉加數

begin

k:=i-j;        //相減得到另乙個加數

if a[i]+a[j]+a[k]=n then inc(ans);   //火柴數和為n則計數器加一

end;

每個數的花費火柴數是可以預處理得到的。

for i:=0 to 9 do

a[i]:=c[i];

for i:=10 to 1111 do

a[i]:= a[i div 10] +a[i mod 10];   //預處理每個數所需要的火柴數

陣列aa[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

數字所需火柴數

如數字12需要的火柴數為:

a[12]= a[12 div 10]+ a[12 mod 10]

=a[1]+a[2]

=2+5

=7【輸入輸出樣例2解釋】

9個等式為:

0+4=4

0+11=11

1+10=11

2+2=4

2+7=9

4+0=4

7+2=9

10+1=11

11+0=11

另一種思路:

一道很水的水題,只需暴力列舉,但是還是有些東西需要注意:

①有位仁兄他只列舉了10×10,(因為他以為只有0~9),實際上,需要列舉很多很多,比如1111+1=1112是四位數裡

最小的,但需要25根,剛剛好大於了n的資料範圍,所以只需要列舉三位數×三位數就可以了。

②這是我的錯誤了,我用while(k>0)這個來求k所需的棒棒個數,但是,如果k=0時,值應該為6,而我的**會直接跳過,結果變成了0,所以我就錯了55555~/(ㄒoㄒ)/

#include#include#include#include#include#include#include#include#includeusing namespace std;

int n,num[1235]=,d;

int cut(int i)

int main()

printf("%d",d);

}

大牛:列舉a,b驗證

#include#include#include#include#includeusing namespace std;

int n,ans;

int cnt[10]=;

int get(int x)

return tot;

}int main()

1012 數字分類 20

給定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字 思路 1.由於涉及到每個型別的個數級順序,用陣列 count 5 儲存每個型別個數 2.每個型別結果,或者預處理用陣列 ans 5 儲存 3.涉及到最後沒有空格而中間有的情況 include include using namespace...

JoyOI1008 NOIP2008傳球遊戲

時間限制 記憶體限制 評測方式 題目 1000ms 131072kib 標準比較器 local noip2008複賽普及組第三題 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子...

1012 數字分類 20分

題目位址 1.需要了解知識 標頭檔案 include vector int a 5 構建乙個自動變長的二維陣列 a num 5 push back num 在表尾新增元素 a i size 陣列長度printf nf num n為幾,則為小數點後幾位 include include using na...