自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hychychyc

666

  • 博客(23)
  • 收藏
  • 关注

原创 狐狸分奶酪(codeforces 371b)

很容易想到的一个思路是暴力,就是对多的蛋糕吃,进行bfs(); 一旦两种蛋糕相等,就是最小步数的,很容易写。 还有更好的方法,很容易看出,最后的解一定是它们的最大公约数,然后把他们的最大公约数去掉,看看能不能吃成1,记下步骤,也可以看能不能吃成最大公约数,是一样的。#include<cstdio>#include<iostream>#include<cstring>#include<que

2017-06-18 08:46:41 1699

原创 SDOI 游记

去拿了10份就回来了。。。。。。。。。。

2017-06-16 17:00:35 373 1

原创 最大正方形

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关注的人

提示
确定要删除当前文章?
取消 删除