xdoj 2018校賽 網路賽

2021-08-19 00:05:54 字數 2558 閱讀 8335

第一次參加校賽,相比於之前的網路賽,感覺這次難度還行,不算難也不算簡單。

先簡單說說前面幾道題吧

a 水題,找規律

b 水題,最小公倍數

c 稍稍有點難度,先排序,仔細考慮即可

d 水題,找規律

e bfs打表

f 矩陣快速冪遞推

g 找到一一對應的方法bfs

好了,仔細說說最後三題吧。

h 一道看上去很像dp的題,但實際上並不是dp,首先發現這個n挺大的,所以n方的演算法肯定不用考慮了,在網上找了很長時間資料,才找到乙個找斜率最大的演算法,頓時感到豁然開朗,原來被矇騙了,這道題根本就不是dp。先說說找斜率最大的方法,只要找所有相鄰兩點中斜率最大的值就可以了,為什麼,用反證法。假如斜率最大不在相鄰的點,那麼考慮這個最大斜率的兩點連線,發現無論中間的點在上面還是下面,都存在乙個中間點和端點的連線斜率不小於這條邊,於是矛盾。但最小能不能這麼找呢?發現直接找肯定是錯的,但是只要稍稍改變一下演算法即可,首先可以把這些點看成是xy平面的點,那麼如果我們把xy連個值互換的話斜率最大的線就是另乙個裡面斜率最小的線了(因為互為倒數),所以我們只要把這些點按照體重排序,然後再求斜率最大即可。順便一說,由於這個是倒數關係用double誤差會很大所以建議用int代表分子分母的pair表示分數。

貼**

# include 

# include

using

namespace

std;

const

int max_n = 1e6 + 10;

typedef

long

long ll;

typedef pairp;

p a[max_n];

int n;

int main()

sort(a , a + n);

p ans = p(1 , 0);

for(i = 1 ; i < n ; i++)

printf("%.2lf\n", (double)ans.first / ans.second);

}return

0;}

i

個人感覺最難的一道題,思考了好久,不過不知道為什麼突然靈光一現想出了方法,這也讓我認識到了acm中的概率問題不能一味的用數學方法思考,要學會計算機的想法。當時在網上搜尋概率的表示方法,直接**,不但各種人自說自話,有些甚至荒唐可笑,讓我根本沒辦法相信哪個,感覺是乙個非常深奧的問題,不過這些都不要緊,因為我現在其實也沒搞清楚用數學怎麼表示概率,這完全是一道概率dp的遞推題。

說說思想,考慮一些情況,首先如果新增乙個人會怎麼樣,如果之前已經有三個人的日期了,那無論他加在哪堆人裡還是三個人,所以其實不用管具體情況的了,只需要考慮那些只存在1個或2個人在相同日期的情況,然後把他們變成三個人的情況加過去即可(也就是說三個人的情況是單增的),所以用dp[i][j]表示i個1人日期和j個兩人日期的情況(另外根據估計,答案人數肯定比總日期數少,所以不需要關心ij之和大於n的情況),這樣只要不斷遞推下去就可以知道結果了。

貼**

# include 

# include

const

int max_n = 1000;

double dp[max_n + 1][max_n + 1];

int main()

i++;

if(ans >= 0.5)

break;

}printf("%d\n", i);

}return

0;}

j

xdoj壓軸題,感覺難度僅次於i,也是一道概率題,不過其實相比於i題,這道題並不是那麼考驗計算機演算法的功力,主要還是數學的想法。考慮現在是i時被消除的次數的期望,這個期望可以通過乙個等式來表示,只需要等概率地考慮模的數字即可,比如在4個數字時p(1) = 1 / 4 * (0(模一) + p(1)(模二) + p(1) (模三) + p(1)(模四)),也就是說這是乙個方程組,n個等式和n個未知量,肯定是有解的,所以用高斯消元法肯定可以解決,但是仔細發現其實更加簡單,因為對於計算p(b)時,等式後面出現的p(k)中的k不可能比b大(因為取模),所以直接乙個乙個解即可。

貼**

# include 

const

int max_n = 500;

int y[max_n + 1][max_n + 1];

double p[max_n + 1];

int main()

int n;

while(~scanf("%d", &n))

p[i] = g / chu;

}double ans = 0;

for(i = 1 ; i <= n ; i++)

ans += p[i];

//printf("%.2lf %.2lf %.2lf %.2lf\n", p[1], p[2], p[3], p[4]);

printf("%.2lf\n", 1 + ans / n);

}return

0;}

總結一下吧

網路賽本身時間很長,而且還可以在網上查閱資料,本身難度並不高,即使把網路賽搞定了現場賽也依然是乙個艱鉅的任務,可能現場賽結束的時候會寫一篇總結吧。

Fire Air 華科校賽 網路賽

題目 在100000 10000的空地上,有n個時間點,每個時間點會在 xi,yi 上種一棵樹。定義綠色 被樹包圍的空地的個數。問每個時間點之後綠色為多少。如圖 思路 逆向求解,從 0,0 位置將圈外的全標記 給空地加一圈 在分別考慮當前的樹,是在圈內還是圈的外圍。由於vis是全域性陣列,之後的bf...

sdut 3914 校賽 校賽

time limit 1000ms memory limit 65536kb problem description sdut 的校賽是從 2009 年開始的,康納每年看到比賽之後,往往就會喊一聲 ma ji ya ba ku nai 年份的縮寫 比如說 2009 年就會說 ma ji ya ba ...

SDUT 3914 校賽 校賽

time limit 1000ms memory limit 65536kb problem description sdut 的校賽是從 2009 年開始的,康納每年看到比賽之後,往往就會喊一聲 ma ji ya ba ku nai 年份的縮寫 比如說 2009 年就會說 ma ji ya ba ...