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 為素數...