自己社內出的一次小考。。。
感覺身體被掏空。。。知道是dp,但dp**完全打不出來。。。。。。
深深地感到了恐懼。。。。。。
然後我就打的暴搜
2道題,暴搜出58分,竟然還能在53人中得14名。。。。。。
— — — — — — — — — — — — — — — 分割線 — — — — — — — — — — — — — —
總結一下 其實我覺得,暴搜才是王道,dp都是辣雞
1、盡量打正解,不會才打暴搜,雖然還是可以騙到些分,而且還不錯。
2、提高**的首正率,不要花10分鐘打**,30分鐘來除錯
3、思維要盡量拓寬,不要侷限於想到的第一種方法,多想幾種,也許第一種是錯的
— — — — — — — — — — — — — — — — 分割線 — — — — — — — — — — — — — — — —
下面是兩道題 其實都是改編的
題目大意:
1、monkey
有n棵樹,從左到右依次有它們的高度,現在有一群猴子從第一棵樹開始,都要前往最後一棵樹
已知第i只猴子的最長跳躍距離是k[i],也就是說,這只猴子最多能從s跳到s+k[i]
如果這只猴子落點的樹的高度大於等於ta原來的那棵樹的高度,ta的疲勞值就會加1
球每乙隻猴子跳到最後一棵樹至少要累積多少疲勞值
2、telephonewire
有一排電線桿,各自有自己的高度height[i],現在我們需要把這一排電線桿順次連線起來
每連線一條電線所花的費用是ta與旁邊的電線桿的高度差*c
當然,我們也可以花x*x的代價時某根電線桿公升高x公尺
求所需的最小費用
其實這裡還有更完整的::
第一題:monkey
時限:1s 記憶體256mb
【題目描述】有q只猴子要從第一棵樹到第n棵樹去,第i只猴子一次跳躍的最遠距離為ki。如果它在第x棵樹,那它最遠可以跳到第x+ki棵樹。如果第j棵樹的高度比第i棵樹高或相等,那麼它從第i棵樹直接跳到第j棵樹,它的勞累值會增加1。所有猴子一開始在第一棵樹,請問每只猴子要跳到第n棵樹花費的勞累值最小。
輸入格式:
第一行乙個整數n,表示有n棵樹。(2<=n<=1000000)
接下來第二行給出n個正整數d1,d2,……,dn(1<=di<=10^9),其中di表示第i棵樹的高度。
第三行給出了乙個整數q(1<=q<=25),接下來q行,給出了每只猴子一次跳躍的最遠距離ki(1<=ki<=n-1)。
輸出格式:
輸出q行,每行乙個整數,表示乙隻猴子的最小的勞累值。
輸入樣例:
94 6 3 6 3 7 2 6 522
5輸出樣例:
21
第二題:架設**線(telephonewire)
時限1s,記憶體128m
【問題描述】farmer john的奶牛們越來越不滿於牛棚裡一塌糊塗的**服務 於是,她們要求fj把那些老舊的**線換成效能更好的新**線。 新的**線架設在已有的n(2 <= n <= 100,000)根**線桿上, 第i根**線桿的高度為heighti公尺(1 <= heighti <= 100)。 **線總是從一根**線桿的頂端被引到相鄰的那根的頂端 如果這兩根**線桿的高度不同,那麼fj就必須為此支付 c***線桿高度差(1 <= c <= 100)的費用。當然,你不能移動**線桿, 只能按原有的順序在相鄰桿間架設**線。farmer john認為 加高某些**線桿能減少架設**線的總花費,儘管這項工作也需要支出一定的費用。 更準確地,如果他把一根**線桿加高x公尺的話,他得為此付出x^2的費用。 請你幫farmer john計算一下,如果合理地進行這兩種工作,他最少要在這個**線改造工程上花多少錢。
【輸入格式】
* 第1行: 2個用空格隔開的整數:n和c
* 第2..n+1行: 第i+1行僅有乙個整數:height_i
【輸出格式】
* 第1行: 輸出farmer john完成**線改造工程所需要的最小花費
【輸入樣例】
5 2235
14輸出樣例:
15樣例說明:
一共有5根**線桿,在桿間拉**線的費用是每公尺高度差$2。
在改造之前,**線桿的高度依次為2,3,5,1,4公尺。
最好的改造方法是:farmer john把第一根**線桿加高1公尺,把第四根加高2公尺,
使得它們的高度依次為3,3,5,3,4公尺。這樣花在加高電線桿上的錢是$5。
此時,拉**線的費用為$2*(0+2+2+1) = $10,總花費為$15。
— — — — — — — — — — — — — — — — 分割線 — — — — — — — — — — — — — — — —
以下是題解::
第一題:
f[i]表示這只猴子跳到第i棵樹所花的最小疲勞值,那麼
f [ i ] = min ( f [ i ] , f [ j ] + ( h [ i ] > h [ j ] ) )
其中 i 1 ~ n,j i - m ~ i - 1
然後我們發現其實這個樹的高度其實是可以用乙個單調佇列來記錄一下的
然後就可以把時間複雜度縮為o(nq)
以下是**:
#include#include#includeusing namespace std;
inline void read(int &x)
while(s>='0'&&s<='9')
x*=f;
}inline void pr(int x)
if(x>9)
pr(x/10);
putchar(x%10+48);
}//快讀快輸不解釋
int a[1000005],dp[1000005];
int i,n,j,k,z,m;
dequeq;
int main()
pr(dp[n]),putchar('\n');
q.clear();
memset(dp,0,sizeof(dp));//別忘了清空
}}
第二題:
dp[i][j]表示第i根電線桿的高度是j公尺時前面所有的費用的最小值
最基礎的狀態轉移方程:
f [ i ] [ j ] = ( j - h[ i ] ) * ( j - h[ i ] ) + min ( f [ i-1 ] [ k ] + c * | j - k | )
我們把這個方程裡的絕對值去掉,就可以得到
1、j>=k
f [ i ] [ j ] = ( j - h [ i ] ) * ( j - h [ i ] ) + min ( f [ i-1 ] [ k ] - c * k + c * j )
2、j<=k
f [ i ] [ j ] = ( j - h[ i ] ) * ( j - h [ i ] ) + min ( f [ i - 1 ] [ k ] + c * k - c * j )
這裡的等號放在**都可以
1、 f [ i ] [ j ] = ( j - h [ i ] ) ^ 2 + c * j + min ( f [ i - 1 ] [ k ] - c * k )
2、 f [ i ] [ j ] = ( j - h [ i ] ) ^ 2 - c * j + min ( f [ i - 1 ] [ k ] + c * k )
我們發現後面的這個min其實可以記錄一下,j 迴圈時再去更新min
這樣就可以把最裡面的一層o ( n ) 的縮為o ( 1 ),所以總時間複雜度是o ( n * maxh )
再上**:
#include#include#includeusing namespace std;
inline void read(int &x)
while(s>='0'&&s<='9')
x*=f;
}inline void pr(int x)
if(x>9)
pr(x/10);
putchar(x%10+48);
}//快讀快輸不解釋
int a[100005],dp[100005][105],i,n,j,k,c,m,minn;
int main()
} minn=2147483647;
for(i=a[n];i<=m;i++)
minn=min(dp[n][i],minn);//根據dp的意思,在最後一根電線桿的高度上找min值
pr(minn);
}
星星之火OIer 星星題解
題目大意 天文學家經常研究星形圖,其中恆星由平面上的點表示,每顆恆星都有笛卡爾座標。讓恆星的水平為不高於恆星的數量,而不是給定恆星的右側。天文學家想知道恆星水平的分布。例如,檢視上圖中顯示的地圖。星號5的等級等於3 它由三顆恆星形成,數字為1,2和4 並且由2和4編號的星的等級是1.在該地圖上,只有...
星星之火OIer 矩形牛棚題解
題目大意 在一塊地板上整齊的鋪滿地磚,但其中有一些有汙跡,現在要求你找出乙個沒有汙跡的最大正方形 以下1代表有汙跡 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 其中最大正方形的邊長為2 狀態轉移方程 dp i j min dp i 1 j mi...
星星之火OIer 快讀 快輸
在這裡給大家介紹一下快讀快輸,自己也存個檔。inline void read int x while s 0 s 9 x f 正數不改變符號 x 1 負數就改變 x 1 此之謂快讀inline void pr int x if x 9 因為putchar一次只能輸出一位,而且要從前往後輸出,所以要用...