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時的所...