1059 C語言競賽

2022-08-20 18:54:11 字數 1604 閱讀 2075

c 語言競賽是浙江大學計算機學院主持的乙個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽:

冠軍將贏得乙份「神秘大獎」(比如很巨大的一本學生研究**集……)。

排名為素數的學生將贏得最好的獎品 —— 小黃人玩偶!

其他人將得到巧克力。

給定比賽的最終排名以及一系列參賽者的id,你要給出這些參賽者應該獲得的獎品。

輸入格式:

輸入第一行給出乙個正整數n(<=10000),是參賽者人數。隨後n行給出最終排名,每行按排名順序給出一位參賽者的id(4位數字組成)。接下來給出乙個正整數k以及k個需要查詢的id。

輸出格式:

對每個要查詢的id,在一行中輸出「id: 獎品」,其中獎品或者是「mystery award」(神秘大獎)、或者是「minion」(小黃人)、或者是「chocolate」(巧克力)。如果所查id根本不在排名裡,列印「are you kidding?」(耍我呢?)。如果該id已經查過了(即獎品已經領過了),列印「id: checked」(不能多吃多占)。

輸入樣例:

6

1111

6666

8888

1234

5555

0001

68888

0001

1111

2222

8888

2222

輸出樣例:

8888: minion

0001: chocolate

1111: mystery award

2222: are you kidding?

8888: checked

2222: are you kidding?

解題思路:

分析題意,最後要查詢 id 對應的排名。可如果資料很多,怎麼查詢最快?

二分查詢!時間複雜度 o(logn)!

二分查詢的要求是資料是有序的,所以這裡可以用快速排序 (qsort),先將其按順序排列。

可不可以再快點?

當然可以。

參賽者的 id 由四位數字組成,則範圍為 0-9999。那就把這當作資料下標唄。將輸入的資料「乙個蘿蔔乙個坑」的放進去,等輸入結束,他們就已經是有序的了。省去了排序的過程。不過也增加了空間的複雜度。

相應地,查詢也變成了 o(1)。比二分更快。

本文**使用了後者的思路。

解題**:

#includeint isprime (int i);

int main()

; for (int i=0; iint k;

scanf("%d", &k);

for (int i=0; iif (a[temp] == 0)

if (a[temp] == 1)

if (isprime(a[temp]))

printf("chocolate\n"); }

return 0;

} int isprime(int i)

if (i % 2 == 0)

for (int j=2; j*j<=i; j++)

} return 1;

}

1059 C語言競賽

c語言競賽是浙江大學計算機學院主持的乙個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽 0.冠軍將贏得乙份 神秘大獎 比如很巨大的一本學生研究 集 1.排名為素數的學生將贏得最好的獎品 小黃人玩偶!2.其他人將得到巧克力。給定比賽的最終排名以及一系列參賽者的id,你要給出這些參賽者應該...

1059 C語言競賽

c語言競賽是浙江大學計算機學院主持的乙個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽 0.冠軍將贏得乙份 神秘大獎 比如很巨大的一本學生研究 集 1.排名為素數的學生將贏得最好的獎品 小黃人玩偶!2.其他人將得到巧克力。給定比賽的最終排名以及一系列參賽者的id,你要給出這些參賽者應該...

1059 C語言競賽

1.解題思路 ran陣列標記每個id對應的排名,集合ss儲存所有已經詢問過的id 如果發現當前id已經出現在ss中,則輸出 checked 如果ran id 0 說明當前id不在排名列表中,所以輸出 are you kidding?如果ran id 為1則輸出 minion 如果ran id 為素數...