解題報告 數學2

2022-06-04 02:30:12 字數 3865 閱讀 1276

2、數學,又是數學(mathagain)

其實吧,大家也發現了,這六道題本來是一科一道的,但是呢,由於某某人比較……,就不顧某某人的反對拋棄了我們可愛的english,又出了一道math……

題目描述

liukeke同學(我們敬愛滴親愛滴可愛滴班長大人)最近又在忙著開班會(真是個工作狂),於是乎,數學學案就被拋到了九霄雲外,直到預備鈴打完,他才發現那張美麗的雪白的學案,眼看一場血案即將發生,他請你用最快的速度幫他算完第一題:

給定乙個數串,數串的長度為n,現在將乙個子串的每個數字之和定義為該子串的數串和,請你求出數串中有多少個子串的數串和為正數。

輸入格式

第一行乙個數n,表示數串的長度。

第二行一共n個數,表示數串中的每個數

輸出格式

就乙個數,表示數串中有多少個子串的數串和為正數。

樣例輸入

38 -9 2

樣例輸出

3資料範圍

30%   n<=1000。

100%  n<=100000。

liukeke 的學科試題之五·數學

2。(因為此人實在不知道怎麼出英語了,⊙﹏⊙b)

預處理出累和,不難發現,只要前乙個和小於後乙個,這兩個的差所表示的那一段數列的和就是正數。

然後,就對累和的那個數列歸併求順序對。好吧,我承認我當時把這個演算法給忘了。

**(liukeke

)var

a,b:array[0..100000] of longint;

i,n,t:longint;ans:int64;

procedure merge(l,r:longint);

var mid,i,j,k:longint;

begin

if l=r then exit;

mid:=(l+r)>>1;

merge(l,mid);merge(mid+1,r);

i:=l; j:=mid+1; k:=l;

while (i<=mid) and(j<=r) do

begin

if a[i]>=a[j] then begin inc(ans,i-l);b[k]:=a[j];inc(k);inc(j);end

else begin b[k]:=a[i]; inc(k);inc(i);end;

end;

if i<=mid then for j:=i to mid do

begin

b[k]:=a[j];inc(k);

endelse for i:=j to r do

begin

b[k]:=a[i];inc(k);

inc(ans,mid-l+1);

end;

for i:=l to r do a[i]:=b[i];

end;

begin

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

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

readln(n);

fillchar(a,sizeof(a),0);

for i:=1 to n do

begin

read(t);

a[i]:=t+a[i-1];

end;

merge(0,n);

writeln(ans);

close(input);close(output);

end.

補充:歸併求逆序對。

type

arr=array[0..40000] of longint;

vartemp,a,b:arr;

c:array[0..200,0..200] of longint;

i,j,k,m,n,ans1,ans2:longint;

procedure hba(l,mid,r:longint);

vari,j,k,kk:longint;

begin

i:=l; j:=mid+1;

for kk:=l to r do

begin

if (i<=mid)and((a[i]<=a[j])or(j>r)) then

begin

temp[kk]:=a[i];

inc(i);

endelse

begin

temp[kk]:=a[j];

inc(j);

if iprocedure mergea(s,t:longint);

vark:longint;

begin

if s=t then exit;

k:=(s+t)>>1;

if k>s then mergea(s,k);

if t>k+1 then mergea(k+1,t);

hba(s,k,t);

end;

procedure hbb(l,mid,r:longint);

vari,j,k,kk:longint;

begin

i:=l; j:=mid+1;

for kk:=l to r do

begin

if (i<=mid)and((b[i]<=b[j])or(j>r)) then

begin

temp[kk]:=b[i];

inc(i);

endelse

begin

temp[kk]:=b[j];

inc(j);

if iprocedure mergeb(s,t:longint);

vark:longint;

begin

if s=t then exit;

k:=(s+t)>>1;

if k>s then mergeb(s,k);

if t>k+1 then mergeb(k+1,t);

hbb(s,k,t);

end;

begin

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

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

while not eof do

begin

readln(n,m);

for i:=1 to n do

begin

for j:=1 to n do read(c[i,j]);

readln;

end;

if odd(m) then

begin

for i:=1 to n do

for j:=1 to n do

a[(i-1)*n+j]:=c[i,j];

for j:=1 to n do

for i:=1 to n do

b[(j-1)*n+i]:=c[i,j];

endelse

begin

for i:=1 to n do

for j:=1 to n do

b[(i-1)*n+j]:=c[i,j];

for j:=1 to n do

for i:=1 to n do

a[(j-1)*n+i]:=c[i,j];

end;

ans1:=0; ans2:=0;

mergea(1,n*n);

mergeb(1,n*n);

if ans1=ans2 then

writeln('nyy and xyy will try again')

else

if ans1注:題目中要求求兩遍逆序對,就是用歸併排序做。需要注意的點:在處理的資料比較多的時候不要再合併時fillchar temp

,在遞迴的時候判斷一下大小(紅的地方),不然可能棧溢位。

解題報告 數學

1 函式 又是函式 問題描述 話說leve最最最討厭數學,每次考試都因為數學悲劇 大頭頭還極其可惡的冒天下之大不韙的讓同學們把那本16開500頁的2012高考數學核按鈕做完 為什麼要叫核按鈕呢?你懂得 現在,leve被一道函式題難住了,為了省出更多的時間學oi,她把這道題交給了你。給定乙個函式f x...

解題報告2

2.解題報告包含哪些內容?coding的前奏是對問題的分析 已知輸入 input 輸出output 讓我們設計中間過程design,也就是什麼樣的演算法使得對於給定的輸入,能夠得到所要的輸出。以往,課堂上老師的講解,都是給定輸出input以及design,用最合理的邏輯最能夠理解的語言讓學生順利地認...

HDOJ2512解題報告 數學

題目概述 給定n張卡,求將這n張卡分為1 n堆的所有分法之和。大致思路 顯然應該是數學題。首先應該確定所有的分組情況,比如n 2時可以分為兩組每組一張卡或一組兩張卡,對於確定分組情況,我們可以用求和的方式表示,如 4 1 1 1 1 4 2 1 1 4 2 2 4 3 1 4 4可以表示n 4時的所...