組委會正在為美團點評codem大賽的決賽設計新賽制。現在請問,參賽者小美最多可以活到第幾輪(初始為第0輪)?比賽有 n 個人參加(其中 n 為2的冪),每個參賽者根據資格賽和預賽、複賽的成績,會有不同的積分。
比賽採取錦標賽賽制,分輪次進行,設某一輪有 m個人參加,那麼參賽者會被分為 m/2 組,每組恰好 2 人,m/2組的人分別廝殺。我們假定積分高的人肯定獲勝,若積分一樣,則隨機產生獲勝者。獲勝者獲得
參加下一輪的資格,輸的人被淘汰。重複這個過程,直至決出冠軍。
輸入描述:
第一行乙個整數 n (1≤n≤ 2^20),表示參加比賽的總人數。輸出描述接下來 n 個數字(數字範圍:-1000000…1000000),表示每個參賽者的積分。
小美是第乙個參賽者。
小美最多參賽的輪次。示例1
輸入
4輸出4 1 2 3
昨天看了《啊哈演算法》的後記《還能更好嗎——微軟亞洲研究院面試》很受啟發,看著作者將 乙個演算法從 o(n*n) 的複雜度降到 o(n),沒想到這仍然不是最優解。這讓我想到我寫題時,只為了過題而寫題,當題過後幾乎就再也沒有思考過優化的問題了。這或許是我一直這麼菜的原因吧。或許多問一下「還能更好嗎?」,真的就收穫到意想不到的驚喜。思路:
首先看完題想到的是將輸入的值進行排序,找出第乙個值 **a** 在排序後的**位置*num***。由於題目說**參賽者小美最多可以活到第幾輪**,因此在與相等的值比較時,我們就預設小美贏。接著每次淘汰賽讓她和比她小或等於的值比較。直到沒有為止。
接著我就想到必須要排序才能找到num的值嗎?好像不用。只要在輸入時比較輸入的數是否比它小就行了,這樣也不用乙個陣列儲存輸入的數,節省了空間。
同時,每一輪淘汰賽結束時,比a小的值也會淘汰一部分。為了讓比a小的值盡量剩下最多,所以讓比a小的值之間相互比較。這很好理解,因為這些數和比a大的數比較一定會都被淘汰,互相計較還能剩下一半。然後重複上述步驟,直到沒有為止。
ac**:
#include
#include
#define ll long long
using
namespace std;
int n,a[
1005];
intmain()
int ans=0;
while
(num!=0)
} cout<}
錦標賽問題 遞迴
設有n位選手參加網球迴圈賽,n 2 k,迴圈賽共進行n 1天,每位選手要與其他n 1位選手比賽一場,且每位選手每天比賽一場,不能輪空,按一下要求為比賽安排日程,1 每位選手必須與其他n 1格選手格賽一場 2 每個選手每天只能賽一場 3 迴圈賽一共進行n 1天 請按此要求將比賽日程表設計成有n行和n ...
NOIP模擬 錦標賽
403機房最近決定舉行一場錦標賽。錦標賽共有n個人參加,共進行n 1輪。第一輪隨機挑選兩名選手進行決鬥,勝者進入下一輪的比賽,第二輪到第n 1輪再每輪隨機挑選1名選手與上一輪勝利的選手決鬥,最後只剩一輪選手。第i名選手與第j名選手決鬥,第i名選手勝利的概率是a i j 作為一號選手的富欖想知道如何安...
全國沙灘足球錦標賽
全國沙灘足球錦標賽由中國足球協會主辦,是國內沙灘足球最高端別賽事。屆數年份 時間冠名 地點備註 第十二屆 11月12日 11月15日 普陀山杯 舟山市朱家尖南沙景區 第十一屆 9月26日 9月28日 烏海市蒙根花休閒農牧業科技開發園 第十屆11月1日 11月3日 普陀杯舟山市朱家尖南沙景區 第九屆1...