NOIP2010普及組初賽試題錯題整理

2021-10-09 06:17:47 字數 3705 閱讀 6797

11.乙個字長為8位的整數的補碼是11111001,則它的原碼是

( d )。

a.00000111

b.01111001

c.11111001

d.10000111

分析:二進位制中負數才有補碼,將補碼-1再按位取反,注意第一位保留1.

佇列快照是指在某一時刻佇列中的元素組成的有序序列。例如,當元素1、2、3入隊,元素1出隊後,此刻的佇列快照是"2 3"。當元素2、3也出隊後,佇列快照是"",即為空。現有3個正整數元素依次入隊、出隊。已知它們的和為8,則共有____49_____種可能的不同的佇列快照(不同佇列的相同快照只計一次)。例如,「5 1」、「4 2 2」、""都是可能的佇列快照;而"7"不是可能的佇列快照,因為剩下的2個正整數的和不可能是1。

分析:三個數之和不超過8,所以單個資料最大為6,所有組合包括一位數,二位數,三位數即1、2、3、4、5、6、11、12、13、14、15、16、111、112、113、114、115、116…611

共48個,但是還有乙個特例就是全部出隊

共49個

雙向鍊錶中有兩個指標域 llink 和 rlink,分別指向該結點的前驅及後繼。設 p 指向鍊錶中的乙個結點,它的左右結點均非空。現要求刪除結點 p,則下面語句序列中錯誤的是( )。

a. p->rlink->llink=p->llink; p->rlink->llink->rlink=p->rlink; delete p;

b. p->llink->rlink=p->rlink; p->llink->rlink->llink=p->llink; delete p;

c. p->llink->rlink=p->rlink; p->rlink->llink=p->llink; delete p;

d. p->rlink->llink=p->rlink; p->llink->rlink=p->llink; delete p;

答案a是正確的。前半部分p->rlink->llink=p->llink;更新了p後繼結點的llink ,使其指向p->llink。後半部分p->rlink->llink指向的就是p的前驅,刪除p,其應指向p->rlink。

答案b正確。原理與答案a類似。

答案c正確

答案d錯誤。p->rlink->llink=p->llink;,p->llink->rlink=p->rlink;

#include

using

namespace std;

const

int num=5;

intr

(int n)

intmain()

列舉遞迴結果

完善程式

(過河問題) 在乙個月黑風高的夜晚,有一群人在河的右岸,想通過唯一的一根獨木橋走到河的左岸。在伸手不見五指的黑夜裡,過橋時必須借照燈光來照明,不幸的是,他們只有一盞燈。另外,獨木橋上最多能承受兩個人同時經過,否則將會坍塌。每個人單獨過獨木橋都需要一定的時間,不同的人要的時間可能不同。兩個人一起過獨木橋時,由於只有一盞燈,所以需要的時間是較慢的那個人單獨過橋所花費的時間。現在輸入 n(2≤n<1000)n(2≤n<1000)和這 nn 個人單獨過橋需要的時間,計算總共最少需要多少時間,他們才能全部到達河左岸。

例如,有 3 個人甲、乙、丙,他們單獨過橋的時間分別為11、22、44,則總共最少需要的時間為 77。具體方法是:甲、乙一起過橋到河的左岸,甲單獨回到河的右岸將燈帶回,然後甲,丙在一起過橋到河的左岸,總時間為 2+1+4=72+1+4=7。

#include

#include

using

namespace std;

const

int size=

100;

const

int infinity =

10000

;const

bool left=

true

;const

bool right =

false

;const

bool left_to_right=

true

;const

bool right_to_left=

false

;int n,hour[size]

;bool pos[size]

;int

max(

int a,

int b)

intgo

(bool stage)

if( ① )

return ans;

ans=infinity;

for(i=

1;i<=n-

1;i++)if

(pos[i]

==right)

for(j=i+

1;j<=n;j++)if

(pos[j]

==right)

return ans;}if

(stage==left_to_right)

return ans;

}return0;

}int

main()

cout<<

go(right_to_left)

<

return0;

}

分析:本題通過深度優先搜尋,計算最小過橋時間。go(stage)中stage表示不同的搜尋方向,從右到左或是從左到右。

①,通過記錄右邊橋頭的人數來判斷是否遞迴呼叫結束。當右邊橋頭人數num<=2時,結束呼叫。

②,暴力列舉所有組合,打擂台求往返兩端的最少時間。tmp=max(hour[i],hour[j])+ go(left_to_right);,max(hour[i],hour[j])表示從右邊到左邊用時,go(left_to_right)深度優先搜尋當前分支的總用時。

③,處理從左向右走時的時間,所以應判斷 pos[i] == left

④,計算如果讓第i個人返回時所用的總時間,此時tmp=hour[i]+go(right_to_left);

⑤,回溯時要求恢復現場,pos[i]=left。

(哥德**猜想)哥德**猜想是指,任一大於2的偶數都可寫成兩個質數之和。迄今為止,這仍然是乙個著名的世界難題,被譽為數學王冠上的明珠。試編寫程式,驗證任一大於2且不超過n的偶數都能寫成兩個質數之和。

#include

using

namespace std;

intmain

(void)if

(tmp)

} ans =0;

for(i =

2; i <= n /

2; i++)if

(tmp)

ans++;}

cout << ans << endl;

return0;

}

分析:哥德**猜想先要線性求質數,1:將tmp初始化成真。

2:求質數

3:將質數儲存

4:證明哥德**猜想

5:1004

3.以下邏輯表示式的值恒為真的是( )。

a.p∨(¬p∧q)∨(¬p∧¬q)

b.q∨(¬p∧q)∨(p∧¬q)

c.p∨q∨(p∧¬q)∨(¬p∧q)

d.p∨¬q∨(p∧¬q)∨(¬p∧¬q)

分析:將p、q帶入真假值求即可

NOIP 2010 普及組解題報告

題目分析 一 數字統計 此題,曾經在某oj上看到過原題。要求和實現都非常簡單。無非是,列舉出所有在範圍內的數字,然後對數字進行拆分,對每一位數字進行判斷。乙個樸素的for迴圈,巢狀乙個while迴圈,就可以解決這道題目。下面是程式的核心部分 for i l i r i 此題丟分,絕對可以認為是絕不應...

NOIP2010 普及組 數字統計

題目鏈結 題目描述 請統計某個給定範圍 l,r 的所有整數中,數字 2 出現的次數。比如給定範圍 2,22 數字 2 在數 2 現了 1 次,在數 12 現 1 次,在數 20 現 1次,在數 21 現 1 次,在數 22 現 2次,所以數字 2 在該範圍內一共出現了 6次。輸入格式 2個正整數 l...

NOIP 2010 普及組解題報告

題目分析 一 數字統計 此題,曾經在某oj上看到過原題。要求和實現都非常簡單。無非是,列舉出所有在範圍內的數字,然後對數字進行拆分,對每一位數字進行判斷。乙個樸素的for迴圈,巢狀乙個while迴圈,就可以解決這道題目。下面是程式的核心部分 for i l i r i t i while t 0 y...