NOIP2016普及組第四題 魔法陣

2021-07-25 13:48:08 字數 3183 閱讀 6863

題目描述

六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。

大魔法師有m個魔法物品,編號分別為1,2,…,m。每個物品具有乙個魔法值,我們用xi表示編號為i的物品的魔法值。每個魔法值xi是不超過n的正整數,可能有多個物品的魔法值相同。

大魔法師認為,當且僅當四個編號為a,b,c,d的魔法物品滿足xa『

現在,大魔法師想要知道,對於每個魔法物品,作為某個魔法陣的a物品出現的次數,作為b物品的次數,作為c物品的次數,和作為d物品的次數。

輸入輸出格式

輸入格式: 

輸入檔案的第一行包含兩個空格隔開的正整數n和m。

接下來m行,每行乙個正整數,第i+1行的正整數表示xi,即編號為i的物品的魔法值。

保證每個xi是分別在合法範圍內等概率隨機生成的。

輸出格式: 

共輸出m行,每行四個整數。第i行的四個整數依次表示編號為i的物品作 為a,b,c,d物品分別出現的次數。

保證標準輸出中的每個數都不會超過10^9。

每行相鄰的兩個數之間用恰好乙個空格隔開。

輸入輸出樣例

輸入樣例#1: 

30 8 

1 24 

7 28 

5 29 

26 24 

輸出樣例#1: 

4 0 0 0 

0 0 1 0 

0 2 0 0 

0 0 1 1 

1 3 0 0 

0 0 0 2 

0 0 2 2 

0 0 1 0 

輸入樣例#2: 

15 15 

1 2 

3 4 

5 6 

7 8 

9 10 

11 12 

13 14 

15 輸出樣例#2: 

5 0 0 0 

4 0 0 0 

3 5 0 0 

2 4 0 0 

1 3 0 0 

0 2 0 0 

0 1 0 0 

0 0 0 0 

0 0 0 0 

0 0 1 0 

0 0 2 1 

0 0 3 2 

0 0 4 3 

0 0 5 4 

0 0 0 5 

說明【樣例解釋1】

共有5個魔法陣,分別為:

物品1,3,7,6,其魔法值分別為1,7,26,29;

物品1,5,2,7,其魔法值分別為1,5,24,26;

物品1,5,7,4,其魔法值分別為1,5,26,28;

物品1,5,8,7,其魔法值分別為1,5,24,26;

物品5,3,4,6,其魔法值分別為5,7,28,29。

以物品5為例,它作為a物品出現了1次,作為b物品出現了3次,沒有作為c物品或者d物品出現,所以這一行輸出的四個數依次為1,3,0,0。

此外,如果我們將輸出看作乙個m行4列的矩陣,那麼每一列上的m個數之和都應等於魔法陣的總數。所以,如果你的輸出不滿足這個性質,那麼這個輸出一定不正確。你可以通過這個性質在一定程度上檢查你的輸出的正確性。

【資料規模】 

這題我拿了55分(11個點),這題資料比較大。

這題我是用列舉

我是先用快排,將魔法值從小到大排序出來,再用四個for將每一種情況列舉出來,在判斷這四個數符不符合條件。如果符合,就在相應位置上加1。

這題我怕資料爆了,所以就將資料縮小了。

**如下:

var  n,m,i,j,k,w:longint;

a,b:array[1..400]of longint;

x:array[1..400,1..4]of longint;

procedure

qsort

(l,r:longint);

var i,j,mid,t:longint;

begin

if l>=r then

exit;

i:=l; j:=r; mid:=a[(i+j) div

2]; repeat

while mid>a[i] do inc(i);

while middo dec(j);

if i<=j then

begin

t:=a[i]; a[i]:=a[j]; a[j]:=t;

t:=b[i]; b[i]:=b[j]; b[j]:=t;

inc(i);

dec(j);

end;

until i>j;

qsort(i,r);

qsort(l,j);

end;

begin

assign(input,'magic.in');

assign(output,'magic.out');

reset(input);

rewrite(output);

read(n,m);

for i:=1

to m do

begin

read(a[i]); b[i]:=i; end;

qsort(1,m);

for i:=1

to m-3

dofor j:=i+1

to m-2

dofor k:=j+1

to m-1

dofor w:=k+1

to m do

if (a[j]-a[i]=2*(a[w]-a[k]))and(a[i]and(a[j]and(a[k]and(a[j]-a[i]

begin

inc(x[b[i],1]);

inc(x[b[j],2]);

inc(x[b[k],3]);

inc(x[b[w],4]);

end;

for i:=1

to m do

begin

for j:=1to4

dowrite(x[i,j],' ');

writeln;

end;

close(input);

close(output);

end.想看更多的請到:

NOIP2016普及組第四題魔法陣解說 水法

其實呢,這道題大部分是思路,對於資訊學的 啊 演算法啊,並沒有特別高的要求。看到題目資料,便大吃一驚 資料裡的水分呢?暴搜和水法肯定是不能ac的了。不過,資料就像海綿,只要擠,總是有水的。事實證明,水法真神奇,暴力出奇蹟 同樣適用於這道題目。4重迴圈,時間o n 4 也是可以水到過半的分的。然而,頓...

NOIP 2016 普及組 海港

題目鏈結 小k是乙個海港的海關工作人員,每天都有許多船隻到達海港,船上通常有很多來自不同國家的乘客。小k對這些到達海港的船隻非常感興趣,他按照時間記錄下了到達海港的每一艘船隻情況 對於第i艘到達的船,他記錄了這艘船到達的時間ti 單位 秒 船上的乘客數ki,以及每名乘客的國籍 xi,1,xi,2,x...

noip2016普及組複賽總結

9點半從紀中出發,大概11點多來到廣州六中。在六中旁邊一家小餐館吃了中餐,那餐廳真心很貴,一盆飯就要20元,我們那桌吃了四 盆.xc 不想買單啦 啦啦啦 然後就來到六中的某個功能室百無聊賴的休息了一會兒,兩點鐘進考場。兩點半 比賽開始,還是先看題.一二兩題太水了,直接開碼,1小時搞定兩題 三點半 仔...