- 博客(23)
- 收藏
- 关注
原创 狐狸分奶酪(codeforces 371b)
很容易想到的一个思路是暴力,就是对多的蛋糕吃,进行bfs(); 一旦两种蛋糕相等,就是最小步数的,很容易写。 还有更好的方法,很容易看出,最后的解一定是它们的最大公约数,然后把他们的最大公约数去掉,看看能不能吃成1,记下步骤,也可以看能不能吃成最大公约数,是一样的。#include<cstdio>#include<iostream>#include<cstring>#include<que
2017-06-18 08:46:41 1699
原创 最大正方形
dp 处理一个矩阵前缀和,就可以O(n)的求出矩阵的和了,而且只有和为完全平方数才是正方形,因为数据只有1吗,要是不是一的话就不容易了 这样再枚举一个起点,和一个边长就是任意一个正方形了,再优化剪枝一下,就可以0ms过了#include<cstdio>#include<iostream> using namespace std;int n,m;int maxn=1;int a[101][
2017-06-06 11:24:14 560
原创 bzoj3713
斐波那契亚数列,直接暴力就行了,我是预处理出来,在输出#include<cstdio>#include<iostream>#include<cstring>#include<map>using namespace std;long long f[199999];map<long long,bool>a; int t;int main(){ f[1]=1; f[2]
2017-06-18 09:56:39 229
原创 汉堡
对汉堡进行二分答案,如果花的钱多了就买少点,少了就买多点#include<cstdio>#include<iostream>#include<cstring>#define ll long longusing namespace std;char a[9999999]; ll r,l,t;int b,s,c,nb,ns,nc,qb,qs,qc;bool check(ll x){
2017-06-16 15:56:18 285
原创 聪明的质检员
二分+前缀和优化,不优化就是o(nmlogn)了 对参数w进行二分答案,通过w对y进行计算,如果找大了,就说明参数w找小了,答案在mid右面,找小了反之。#include<cstdio> #include<iostream>#include<cstring>#define LL long longusing namespace std;LL sum[299999],cnt[299999]
2017-06-12 10:37:46 752
原创 切割网线
对网线的数目二分答案,个数数找小了就网线变小,找大了就变大12345678910111213141516171819202122232425262728293031323334 #include#includeusing namespace std;int n,k,a[19999];int l=1,r=0;int check(int x){ int ans=0; for(int i=1;
2017-06-11 17:19:02 274
原创 子串
这个题我搞了好久,终于算是明白了点吧 看了很多大神的博客,总结出来了一些做法,不知对不对,就写一些吧。 先定义两个数组 sum[i][j][k]就是a串前i个字母,b串前j个字母的方案总数!!!!,就是结果 f[i][j][k]是用第i个字母用的方案数。 因为第i个可以和前i-1合并为一块(但这是方案数不变,因为组数相同,为f[i-1][j-1][k]),也可以不合并,(为sum[i-1]
2017-06-11 17:18:48 182
原创 斗地主
2015最后一题,这道题是大爆搜+贪心,先枚举四带一,三带一,单牌,etc,再枚举顺子优化解,在搜索优化的解是不是优化的(不一定是最优的,所以要递归),在递归回去,找别的顺子优化。#include<cstdio>#include<iostream>#include<cstring>using namespace std;int t,n;int s[5]; int a[9999],b[9999
2017-06-11 09:37:32 361
原创 跳石头
二分答案加贪心 和之前一个丢瓶盖一样,对去几个石子二分,去多了就取大了,去少了就取小了#include<cstdio>#include<iostream>#include<cstring>#define ll long longusing namespace std;ll a[99999],n,m,l,dp[51999],f,d[99999];int check(int x){
2017-06-10 15:22:08 202
原创 阶乘
这个题只要记下最后几位不是零的数就行了,我记了六位,其实没必要记那么多,然会最后把零去除输出就行#include<cstdio>#include<iostream>#include<cstring> #define ll long longusing namespace std;int n;int main(){ scanf("%d",&n);int s=1; for(i
2017-06-09 17:04:55 215
原创 书的复制
这个题就是一个动归,和乘积最大一样,处理前缀和,枚举当前位置和划分层数,找最大的时间,取最小值#include<cstdio>#include<iostream>#include<cstring>using namespace std;int a[999999],f[3999][3999],m,n,s[999999];int print(int x,int y){ if(y==0)
2017-06-08 16:17:25 322
原创 最长上升子序列
最长公共子序列(lcs)到最长上升子序列(lis)的转化。 把第一个串的元素,转化为第二个串的位置,再倒过来,找最长上升子序列。 别问我为什么,我也不知道。。。。。#include<cstdio>#include<iostream>#include<cstring>#include<map>#define ll long longusing namespace std;int a[99
2017-06-08 15:34:56 265
原创 低价购买
第一问很好做,就是一个很简单的dp求最长下降子序列。 第二问就有一些问题了,怎么找最大的方案数呢? 那就需要看状态了,i位置的方案数只能由比他小一的位置转移过来,而且每一个都能转移过来,所以说 因为第一问求出f[i]了 所以递推方程式为 t[i]=∑t[j] (f[j]+1=f[i]) 但还有一个问题,不能重复,如果有相同的情况,就可以把后面的方案数去掉,因为不可能是最优解,这样就不重复
2017-06-07 17:20:23 200
原创 统计单词个数
这个题和之前一个乘法最大思路差不多,就是如果要划分k份之前已经划分了k-1份,划分为k份的就是由,k-1推来的再加上第k份的单词个数,所以就枚举前面k-1分到的位置,是k~当前位置,取最大值,就是结果了 然后单词个数就在线统计就行了,因为以一个数为首字母的只能用一次,所以找最短的单词记下来就行了。#include<cstdio>#include<cstring> #include<iostre
2017-06-07 11:18:01 360
原创 编辑距离(dp)
动态转移方程按三个步骤来,就是从f[i-1][j-1],f[i-1][j],f[i][j-1]+1转移过来 所以就是f[i][j]=min(f[i-1][j-1],f[i-1][j],f[i][j-1])+1#include<cstdio>#include<cstring> #include<iostream>using namespace std;char a[9999],b[9099]
2017-06-07 09:00:10 250
原创 过河(状压dp典型题)
这道题最简单的dp,动态转移方程很好推,因为它是由i-s~t转移来的,所 然而这个题的数据太大了。。。。。10^9 不得不考虑一些没用的操作 所以就考虑一个问题 这个题的石子数太少了,在一定的范围内,你不管怎样跳,石子数也不会增加,所以你就可以把多余的t弄掉,这样就是状压dp了,把一定的没用的范围压起来#include<cstdio>#include<iostream> #include
2017-06-06 18:03:58 484
原创 计算系数
水题一个,不过哪位大神能告诉我为什么,拆开系数符合组合数公式#include<cstdio>#include<iostream> using namespace std;#define p 10007int m,n;int c[55][55];int dp[55][55][55][55];int ans=0;int fastpow(int x,int y,int z){ wh
2017-06-06 10:05:55 269
原创 方格取数or传纸条
用简单的搜索,之前听了从清北写的,一直没写博客,现在补上 这两个题实际上是一样的,传纸条虽然有一个是倒着传,其实和正着传是一样的,所以是一样的 就是用一个四维数组,记下两个点的坐标,两个点都可以向上或向下走,所以可以转移到四种情况,就是我下面分的四种 还可以用动归 动态转移方程是 dp[x][y][x2][y2]=max(dp[x][y-1][x2][y2-1],dp[x-1][y][x2
2017-06-06 09:20:01 278
原创 导弹拦截(数据加强版n<=300000)
普通的求一个最长上升子序列,一个最大下降子序列,输出就OK了,是n^2的复杂度 而这样就过不了300000的点了 所以我们就用二分查找的办法来优化,因为输入的复杂度无法优化,所以复杂度是nlogn 最长上升子序列上升思路: 有一个low数组,low[i]是长度为i的最长子序列的最小值 维护一个上升序列,如果加入的数>low[len],最长子序列就可以更新了,如果小于等于,则把正好大于他的一
2017-06-05 17:48:24 453
原创 导弹拦截(1999noip)
求一个最长上升子序列,一个最大下降子序列,输出就OK了#include<cstdio>#include<iostream>#include<cstring> using namespace std;int m,n;int f[9999],f2[9999],h[9999]; int a[999];int maxn=-9999;int t;int j;int p;int u;int dfs
2017-06-04 11:30:06 310
原创 乘积最大
简单的搜索#include<cstdio>#include<iostream>using namespace std;int k;int s[1999][1999],a[9999];int tot=-999;int m,n;int dfs(int x,int k,int ans,int j){ if(n-x<k)return 1; if(k==0) {
2017-06-02 17:53:25 406
原创 合唱队形(简单的动规)
#include<cstdio>#include<iostream>using namespace std;int m,n;int f[9999],f2[9999],h[9999]; int maxn=-9999;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&h[i
2017-06-02 15:21:03 790
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人