前兩天我和同學們去上海的比賽做了做題(同行切磋),發現自己實力著實不夠啊,人家認為難度正常的題我有一半沒做出來。我先說丙組的題吧,這是最後一題,最難的乙個,有好多人不會,我也算幫幫那些不會的人。
這個問題我用了乙個神奇的演算法——二維字首和。這個演算法和字首和有異曲同工之妙(他倆就是差了個維度)。我們先設定a[i][j]表示前i行前j列一共有多少個空位。然後通過二位字首和初始化,再做一些處理就好了。
要做二維字首和,我們要理解一下原理。(下面有個拙劣的圖)
其中(i,j)就是我們要求的地方,它包含藍色,紅色,紫色,綠色。綠色是他自己所在格仔,紅色和紫色的和是(i,j-1)的值,藍色和紫色的和是(i-1,j)的值。我們把他們都加起來,發現紫色算了2次,我們要把它剪掉,而紫色的部分也就是(i-1,j-1)的值,於是我們讓結果減去(i-1,j-1)的值就好了。
得到公式:
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+這一格是不是空位;嗯,看起來不錯。
經過這一系列操作,我們把陣列的初始化做完了,接下來就是一些小小的優化了。
具體都寫在注釋裡了,來看**吧:
#include#include#include#include#includeusing namespace std;long long n,m,bj,a[805][805],zshu,shu=9999999,k,hehe=0;
char sz;//我不會用scanf讀入string(一直出奇怪的錯誤),所以這裡寫的是char
long long int pd(long long int x,long long int y)
}} }
}int main()
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+bj;//二維字首和的公式
} }for(long long i=1;i<=n;i++)
pd(i,j);
} }printf("%lld",shu);
return 0;
}
乘火車選座小技巧(須知)
坐火車,可算是明白了,以前不知道的現在就學習一下吧,這也是乙個同學告訴我的,我覺得特別實用就發給大家看一下啦。火車票 一 個位數是0,5,4,9的車票都是靠窗的,喜歡靠窗趴桌子上睡覺的注意了!1 其中0,5是三人座靠窗的 2 其中4,9是兩人座靠窗的 二 個位數是2,7,3,8是靠過道的,愛動的,想...
CF839B 飛機選座
時間限制 1s 空間限制 256m daenerys targaryen 有一支由 k 組戰士組成的部隊,第 i 組有 a i 個戰士。她想帶她的戰士們去大海的對面去征服鐵王座。她最近買了乙個飛機來運載她的戰士過海。這個飛機有 n 排,每一排有 8 個座位。相鄰的兩個座位稱為鄰居,比如 或者 dae...
CF839B 飛機選座
時間限制 1s 空間限制 256m daenerys targaryen 有一支由 k 組戰士組成的部隊,第 i 組有 a i 個戰士。她想帶她的戰士們去大海的對面去征服鐵王座。她最近買了乙個飛機來運載她的戰士過海。這個飛機有 n 排,每一排有 8 個座位。定義這幾個位置對為鄰居 daenerys ...