我們把釣魚的過程放在座標系裡來考慮。圖中藍色的點為船,初始時它的座標記為(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。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知...