magic(NOIP2016普及組複賽)

2021-07-24 21:59:03 字數 2344 閱讀 5112

第四題:(magic)

方案一:

暴力,四重迴圈,列舉每乙個數字的在每個位置出現的個數,然後再加起來即可

理想分數:35~45分

方案二:

我們可以用乙個數軸來表示出四個數的位置:

a      b            c     d

__|____|_________|___|____

2i         6i+k         i

從題意中我們可以得出xb~xa=2(xc~xd)

(xc~xb)÷3>xb~xa  那麼 xc~xb>3(xb~xa) 然後xc~xb=3(xb~xa)+k 最後 xc~xb=6(xc~xd)+k

設xc~xd=i 那麼 xa~xb=2i,xb~xc=6i+k;

那麼就需要列舉i 和 xc的位置和xb 的位置,因為k是拿不準的。

加答案時就只用乘另外3個數在輸入時出現的個數。

inc(a[j,1],w[i1]*w[k]*w[l]);

這樣就可以很快的算出所有方案的個數。

理想分數:80~85分

方案三:

那麼我們只能想想100分方法了。

根據上面的方法,我們可以想到乙個絕妙的n方的方法。

首先列舉i,這個免不了,然後算出字首和和字尾和。

還是剛剛那個圖:

a       b            c     d

__|____|_________|___|____

2i        6i+k       i

我們算出字尾和就是到達c最小的取值範圍8i+1.

sj 表示到j這個位置最多有多少個c和d可以存放的位置。

s[j]=s[j+1]+w[j]*w[k];

j是列舉c的位置的,k是由c算出的d的位置,w[i]就是表示i這個數在輸入時出現的次數。

這樣就可以有效的列舉出c和d在後面出現的個數。

在列舉a的位置,算出b的位置,再像上次一樣加答案:

inc(a[j,1],s[k+6i+1]*w[k]);

k就是由j算出來的b的位置,k+6i+1就是當前c最小的位置,再乘乙個b的個數。這樣就相當於85分方法的三個數相乘。

算字首和同理,用來算c和d的方案數。

**:

var

a:array[1..15000,1..4]of longint;

b,w:array[0..40000]of longint;

n,m,i,j,k,l,i1:longint;

s,s1:array[0..15001]of longint;

bz:boolean;

begin

assign(input,'magic.in');reset(input);

assign(output,'magic.out');rewrite(output);

readln(n,m);

for i:=1 to m do

begin

readln(b[i]);

inc(w[b[i]]);

end;

for i:=1 to n div 9 do

begin

fillchar(s,sizeof(s),0);

fillchar(s1,sizeof(s1),0);

for j:=n-i downto 8*i+1 do

s[j]:=s[j+1]+w[j]*w[j+i];

for j:=1 to n-8*i do

begin

i1:=j+i*2;

if (w[i1]>0)and(w[j]>0) then

begin

inc(a[j,1],s[j+8*i+1]*w[i1]);

inc(a[i1,2],s[j+8*i+1]*w[j]);

end;

end;

for j:=2*i to n-7*i-1 do

s1[j]:=s1[j-1]+w[j]*w[j-2*i];

for j:=8*i+1 to n-i do

begin

i1:=j+i;

if (w[i1]>0)and(w[j]>0) then

begin

inc(a[i1,4],s1[j-6*i-1]*w[j]);

inc(a[j,3],s1[j-6*i-1]*w[i1]);

end;

end;

end;

for i:=1 to m do

writeln(a[b[i],1],' ',a[b[i],2],' ',a[b[i],3],' ',a[b[i],4]);

close(input);

close(output);

end.

noip普及2016總結

事實上,我在去年也報了noip的普及組.奈何當年太稚嫩,不懂騙分,只有210.以上都是前話,滿滿的都是不堪回首的黑歷史.1.概述 考前算是做了比較充分的準備吧,至少在每天晚自習都會抽幾分鐘的時間複習一下 事實上功課也並沒有怎麼耽誤 然後就是臨場發揮還是較好吧,可以根據自己的能力與資料的大小寫出合適的...

NOIP 2016 普及組 海港

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

2016NOIP普及組解析

第一題 買鉛筆 easy,不多說 include include include include using namespace std intmain 第二題 回文日期 也很easy,注意特判,過 include include include include int mon 13 using n...