2019 3 2 B題 排行(互動)

2021-09-11 18:42:36 字數 2716 閱讀 6712

今年是 3345 年,你打算還原千年前這場比賽的名次,但是主辦方稱由於技術原因排名遺失了,連

用於排名的 a 也丟失了。所幸,在 byteland 中生活的都是機械人,所以你可以詢問這些千年前的參賽

選手。為了謹慎起見,你可以每次詢問乙個參賽者,某乙個參賽者的比賽成績比它好還是比它差。但是,

機械心理學家告訴你,這些選手不一定願意回答你的提問。具體地:

名次小於 1 的選手由於耿耿於懷,如果它應該回答另乙個參賽者成績比它好,它就會選擇不回答,

否則它會如實回答。

名次為 1 的選手決定悶聲大發財,它無論如何都不會回答任何提問。

名次為 2 的選手只當詢問排名為 3 的選手時才回答比排名 3 的好,其他時候都不回答。

名次為 3 的選手趾高氣揚,如果它應該回答另乙個參賽者成績比它好,它就會選擇不回答,否則

它會如實回答。

名次大於 3 的選手感覺自己水平不行,如果它應該回答另乙個參賽者成績比它差,它就會選擇不

回答,否則它會如實回答。

你希望通過一些詢問還原每個選手的名次,詢問數越少你的得分越高,評分細則請看 notes 一節。

4 ≤ n ≤ 1000,資料保證名次由乙個 a < 1 生成,且存在名次為 1, 2, 3 的選手。

本題有若干個測試點,你本題的得分是每個測試點的得分的最小值。

對於某個測試點,若你沒有正確還原出每個選手的名次,該測試點得 0 分。

否則設你使用了 x 個詢問,設 y = ,

若 y 中有 a 個大於等於 x 的元素,則該測試點得 10a 分。

做得太少了還是沒有經驗。

不難想到將序列分成兩個部分,然後分開排序。

排序的話複雜度為o(n

logn

)o(n~log~n)

o(nlog

n),使用插入排序可以獲得9000次左右的快樂。

那如何分成兩個部分,注意回答比自己高的只有》

3>3

>3的。

那麼不妨掃過去的時候記錄最小值,出現過比自己高的就是》

3>3

>3的。

這一部分複雜度是o(2

n)

o(2n)

o(2n)

然後<=3

<=3

<=3

的一起排,你會發現排完之後1、2

、3

1、2、3

1、2、

3就在序列的末端,但是無法確定順序,再用至多六次即可判斷出位置。

code:

#include

"rank.hpp"

#include

#include

#define pp printf

#define fo(i, x, y) for(int i = x, b = y; i <= b; i ++)

#define fd(i ,x, y) for(int i = x, b = y; i >= b; i --)

using namespace std;

const

int n =

1e3+5;

int ak[n]

[n];

intzz

(int x,

int y)

int ans[n]

;const

int inf =

1e9;

int p[n]

, q[n]

, bz[n]

;intc1(

int x,

int y)

intc2

(int x,

int y)

int b[n]

;void

sort

(int

*p,int

(*cmp)

(int x,

int y))fd

(j, i, as +

2) b[j]

= b[j -1]

; b[as +1]

= p[i];}

fo(i,

1, p[0]

) p[i]

= b[i];}

vector<

int>

work

(int n)

fo(i,

1, n)

if(bz[i]

) q[

++ q[0]

]= i;

else p[

++ p[0]

]= i;

sort

(p, c1)

;sort

(q, c2)

;int u, v;

fo(i, p[0]

-2, p[0]

)fo(j, p[0]

-2, p[0]

)if(i != j)if(

c1(p[i]

, p[j]))

ans[x]=1

; ans[u]=2

; ans[v]=3

;fd(i, p[0]

-3,1

) ans[p[i]]=

3-(p[0

]- i);fo

(i,1

, q[0]

) ans[q[i]]=

3+ i;

fo(i,

1, n) v.

push_back

(ans[i]);

return v;

}

演算法題 A除以B

題目描述 本題要求計算a b,其中a是不超過1000位的正整數,b是1位正整數。你需要輸出商數q和餘數r,使得a b q r成立。輸入描述 輸入在1行中依次給出a和b,中間以1空格分隔。輸出描述 在1行中依次輸出q和r,中間以1空格分隔。輸入例子 123456789050987654321 7 輸出...

演算法題 A除以B

題目描寫敘述 本題要求計算a b。當中a是不超過1000位的正整數,b是1位正整數。你須要輸出商數q和餘數r,使得a b q r成立。輸入描寫敘述 輸入在1行中依次給出a和b,中間以1空格分隔。輸出描寫敘述 在1行中依次輸出q和r,中間以1空格分隔。輸入樣例 12345678905098765432...

快排模板題打卡

模板題 快排的時間複雜度是 o n log2 n o nlog 2 n o nlog 2 n 思想 基於分治 step1 選取分界點x 陣列中的乙個數 step2 調整區間 使得左邊的數均小於等於x,右邊的數均大於等於x step3 遞迴處理左右兩段,分別排好序。模板 includeusing na...