今年是 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...