NOIP2016普及组第四题——魔法阵
題目描述
六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。
大魔法師有m個魔法物品,編號分別為1,2,…,m。每個物品具有一個魔法值,我們用Xi表示編號為i的物品的魔法值。每個魔法值Xi是不超過n的正整數,可能有多個物品的魔法值相同。
大魔法師認為,當且僅當四個編號為a,b,c,d的魔法物品滿足xa‘<’xb’<’xc’<’xd,Xb-Xa=2(Xd-Xc),并且xb-xa<(xc-xb)/3時,這四個魔法物品形成了一個魔法陣,他稱這四個魔法物品分別為這個魔法陣的A物品,B物品,C物品,D物品。
現在,大魔法師想要知道,對于每個魔法物品,作為某個魔法陣的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; beginif l>=r then exit;i:=l; j:=r; mid:=a[(i+j) div 2];repeatwhile mid>a[i] do inc(i);while mid<a[j] do dec(j);if i<=j thenbegint:=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;beginassign(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 doif (a[j]-a[i]=2*(a[w]-a[k]))and(a[i]<a[j])and(a[j]<a[k])and(a[k]<a[w])and(a[j]-a[i]<(a[k]-a[j])/3) thenbegininc(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 dobeginfor j:=1 to 4 do write(x[i,j],' ');writeln;end;close(input);close(output);end. 想看更多的請到:http://blog.csdn.net/ssl_zzy?viewmode=contents
轉載于:https://www.cnblogs.com/YYC-0304/p/9500236.html
總結
以上是生活随笔為你收集整理的NOIP2016普及组第四题——魔法阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图的m着色问题pascal程序
- 下一篇: NOIP2016普及组第三题——海港