NOIP2011模擬11 1 釣魚

2022-05-05 16:57:11 字數 1794 閱讀 4033

我們把釣魚的過程放在座標系裡來考慮。圖中藍色的點為船,初始時它的座標記為(ax,y)。河深為y,河寬為x。某個時刻會從左邊界或右邊界遊出來一條魚(左邊的往右邊遊,右邊的往左邊遊),即魚游出來時的橫座標為0或x,這條魚每秒會游d個單位長度,魚的長度為l。初始時刻為0,對於每個時刻x,船可以選擇花費1s向左或向右移動最多q個單位長度,或者選擇在當前位置進行釣魚,釣魚的動作是瞬間的,且發生在時刻x,魚還來不及移動就被釣上了。如果選擇釣魚,那麼在時刻x就不能動。設當前位置為z,將魚看成一條線段,當線段與直線x=z相交時就認為魚上鉤了,所以一次釣魚動作可能會釣多條魚。

聰明的你告訴釣魚者,在t時刻前最多能釣多少魚?

輸入:第一行:t

第二行:maxx,maxy,表示河寬和河深

第三行:兩個數ax,q

第四行:n,表示有n條魚

接下來n行描述每條魚:每行共五個數,x,y,d,l,time

x表示魚頭的初始位置,保證為0或maxx,y表示魚頭的初始深度,time表示魚出現的時刻(所有的數都為整數)

輸出:只有一行:ans,表示最多的釣魚數

34 5

4 13

0 1 3 1 0

4 2 2 1 0

0 3 3 1 2

100%的資料滿足

1<=t,time<=10

1<=ax,ay,q,x,y,d,l<=10

1<=n<=14

30%的資料滿足

1<=n<=5

考試的時候想到了狀壓dp,但沒有進一步去想

其實這題的轉移方程十分簡單,也容易想到,但是就是放棄了

所以說有想法就可以繼續鑽研下去

首先題目要求的是t時刻前,其實是包括t的

所以說總共會進行t+1次操作

看到n很小,考慮狀壓

設\(f[i][j][s]\)表示現在是\(i\)時刻,\(j\)位置,魚的情況是\(s\)(被釣了是1,沒有是0)的最大魚數

轉移分兩種(以下方程都需要和原來的取\(max\))

移動。那麼\(f[i+1][j-q…j+q][s]=f[i][j][s]\)

釣魚。\(f[i+1][j][s1]=f[i][j][s]+sum\)

\(s1\)表示釣魚後的情況,\(sum\)表示釣上來的數量

對於判斷是否釣上來,可以預處理每條魚在每一分鐘的位置,然後迴圈掃一遍

初始化\(f[0][ax][0]=0\),其餘的是-1

#includeusing namespace std;

int t,mx,my,pos,q,n,sum,s1,ans,st[15],de[15],v[15],l[15],_time[15],fh[15],head[15][15],tail[15][15],f[15][15][33000];

int read()

int main()

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

for (int j=0;j<=t;++j)

if (_time[i]=j&&tail[k][i]<=j)||(head[k][i]<=j&&tail[k][i]>=j)) ++sum,s1|=(1<

f[i+1][j][s1]=max(f[i+1][j][s1],f[i][j][s]+sum);

}ans=-1;

for (int k=0;k<=t+1;++k)

for (int i=0;i<=mx;++i)

for (int j=0;j

ans=max(ans,f[k][i][j]);

printf("%d\n",ans);

return 0;

}

NOIP2011模擬11 1 釣魚

我們把釣魚的過程放在座標系裡來考慮。圖中藍色的點為船,初始時它的座標記為 ax,y 河深為y,河寬為x。某個時刻會從左邊界或右邊界遊出來一條魚 左邊的往右邊遊,右邊的往左邊遊 即魚游出來時的橫座標為0或x,這條魚每秒會游d個單位長度,魚的長度為l。初始時刻為0,對於每個時刻x,船可以選擇花費1s向左...

NOIP2011模擬考試總結

這兩天的考了noip2011的6道題,600分的題大致得了420分左右。a了day1的t1,t2,day2的t1。這次模擬我感覺沒有發揮到自己的飽和水平,犯了非常傻比的錯。day1的第三題讀豎列時,題目說了以零結尾,我還手賤寫了個y 7,這樣如果這一列是滿的話,最後乙個0會被下一列讀進去。把y 7刪...

NOIP2011 模擬 鋪地毯

題目描述 description 為了準備乙個獨特的頒獎典禮,組織者在會場的一片矩形區域 可看做是平面直角座標系的第一象限 鋪上一些矩形地毯。一共有n 張地毯,編號從1 到n。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知...