2016年10月31日
摘要: 四维dp 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=41; 5 int f[N][N][N][N],g[356],a,b,c,d,n,m; 6 int max(int x,int y){ 7 阅读全文
posted @ 2016-10-31 20:45 Absolutezero 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 我们按照左右手数的乘积升序排序,就能使最多金币数最小了 为什么呢? 我们知道: 1)如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人 2)假设相邻的两个人i, i + 1。设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S。 ans1 = max 阅读全文
posted @ 2016-10-31 19:14 Absolutezero 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 反正图两边bfs 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 5 using namespace std; 6 7 inline int readint(){ 8 int x=0,f=1; 9 char ch=getchar 阅读全文
posted @ 2016-10-31 18:49 Absolutezero 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 显然线段树可以搞…… 不过常数需要优化的很小 另一种做法, 我们可以考虑二分答案 每次对于1--mid天维护前缀和判断即可 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=1000010; 5 i 阅读全文
posted @ 2016-10-31 15:18 Absolutezero 阅读(914) 评论(0) 推荐(0) 编辑
摘要: 意思就是费用的最大值最小 那么我们对最大费用进行二分,按此跑最短路,累计扣减血量进行比较即可 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=10010,M=100010; 5 long long 阅读全文
posted @ 2016-10-31 13:56 Absolutezero 阅读(233) 评论(0) 推荐(0) 编辑
摘要: dp 设f[i][j][l]表示A串取i个(但a[i]不一定能取到),B串取j个(b[j]一定能取到),此时用了l个串的方案数。 第一种情况:a[i]==b[j] f[i][j][l]=f[i-1][j-1][l]+f[x][j-1][l-1] 第二种情况:a[i]!=b[j] f[i][j][l] 阅读全文
posted @ 2016-10-31 10:24 Absolutezero 阅读(220) 评论(0) 推荐(0) 编辑