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,這樣可以得到...