牛客練習賽36 BCDF題解

2021-09-07 05:35:38 字數 2066 閱讀 5768

b.rabbit的工作(1)

思路:設d[ i ][ j ][ p ]為在 i 天時,一共工作了 j 天,且連續工作了 p 天直到第 i 天時花費的最小體力。那麼轉移方程很簡單:

update:已經被hacked

如果第 i 天我不工作,那麼對於所有的合法的 p,d[ i ][ j ][ 0 ]=max( d[ i-1 ][ j ][ p ] ),如果我第 i 天工作,那麼對於所有合法的 j 和 p,d[ i ][ j ][ p ]=d[ i-1 ][ j-1 ][ p-1 ]+p,然後對於所有的d[ i ][ j ][ p ]<=k,取乙個最大的 j 當答案即可。

#includeusing namespace std;

int d[405][405][35],n,k,ans;

char s[160000];

int main()

} for(int j=0;j<=n;j++)

for(int p=0;p*(p+1)/2<=n;p++)

if(d[i-1][j][p]!=-1)

}cout#includeusing namespace std;

int d[2][405][405],n,k,ans,cur;

char s[160000];

int main()

} for(int j=0;j<=n;j++)

for(int p=0;p*(p+1)/2<=k;p++)

if(d[!cur][j][p]!=-1)

}cout思路:比賽時看這題毫無頭緒,賽後看別人**也是看了好久才會,設d[ i ]表示用 i 天完成k個任務得到的最大滿意度,那麼我可以從k+1列舉到w求解,但是有個很大的問題,初始化d[ k ]的值後,怎麼求d[ k+1 ]?我只能通過某一天完成 k-1 個任務才能進行狀態轉移,但是d[ i ]表示用 i 天完成 k 個任務的最大值,看起來這樣設方程是無解的,但是有乙個技巧,我令所有的 vi (vi下標從0開始)都減去 v0 ,那麼d[ k+1 ]=d[ k ]+v1的含義就可以表示 k-1 天完成 k-1 個任務時(因為去掉了第乙個任務),再完成第二個任務所能得到的最大滿意度,這樣就可以解決狀態轉移方程了,變成水題了。方程是:d[ i ]=max( d[ i-j ]+v[ j ] ,d[ i ])。

#includeusing namespace std;

const int maxn=4005,inf=1e8;

int d[maxn],a[maxn],n,k,w;

int main()

tag[o]=0; }}

void up(int o,int l,int r,int ql,int qr,int v)

if(ql<=m)up(ls,l,m,ql,qr,v);

if(qr>m)up(rs,m+1,r,ql,qr,v);

mx[o]=max(mx[ls],mx[rs]);

mn[o]=min(mn[ls],mn[rs]);

}int main()

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

ans=max(ans,vis[i]);

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

}

f.rabbit的蛋糕

求任意凸多邊形的面積公式:(逆時針順序遍歷點)

[(x1*y2+x2*y3+x3*y4+x4*y5+x5*y1)-(x1*y5+x2*y1+x3*y2+x4*y3+x5*y4)]/2

這題先求出xi*yi+1,以及yi*xi+1的字首和陣列sum1,sum2,然後怎麼快速求 s t 切割的多邊形面積呢?其實很簡單,隨便畫一下就知道知道了,我就不寫了。

#include#define db double

using namespace std;

const int maxn=1e5+10;

db x[maxn],y[maxn],sum1[maxn],sum2[maxn],ans;

int main()

db s=(sum1[n]-sum2[n])/2;

while(q--)

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

}

牛客練習賽22題解

簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...

題解 牛客練習賽51

字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...

牛客練習賽64 題解

a 怪盜 1412題目描述 乙個長度為n m k包含n個數字1,m個數字2和k個數字4的陣列,最多可能有多少個子序列1412?如果乙個序列是陣列的子串行,當且僅當這個序列可以由陣列刪去任意個元素,再將陣列中的剩餘元素按順序排列而成。思路 將序列排列成111444441111222222,這樣可以得到...