期望得分:100+30+100=230

实际得分:100+30+70=200

T3 数组开小了 。。。。。

记录 1的前缀和,0的后缀和

枚举第一个1的出现位置

#include<cstdio>
#include<cstring>
#include<algorithm> #define N 100002 using namespace std; char s[N]; int num[N]; int suf0[N],pre1[N]; int main()
{
freopen("reverse.in","r",stdin);
freopen("reverse.out","w",stdout);
scanf("%s",s+);
int len=strlen(s+);
for(int i=;i<=len;i++) num[i]=s[i]-'';
for(int i=;i<=len;i++) pre1[i]=pre1[i-]+num[i];
for(int i=len;i;i--) suf0[i]=suf0[i+]+(!num[i]);
int ans=len;
for(int i=;i<=len;i++) ans=min(ans,pre1[i-]+suf0[i]);
ans=min(ans,pre1[len]);
printf("%d",ans);
}

从1——n枚举一遍

二进制表示它有哪些数出现过了,相当于哈希

然后Σ C(i,2)

#include<cstdio>

using namespace std;

int  f[];

void count(int x)
{
int s=;
while(x)
{
s|=<<x%;
x/=;
}
f[s]++;
} int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=;i<=n;i++) count(i);
long long ans=;
for(int i=;i<=;i++) ans+=1ll*f[i]*(f[i]-)/;
printf("%I64d",ans);
}

考场思路:

种类只有2^9种可能

所以枚举每一种可能

那问题转化为了 有x种数,用它来组成<=n的数的方案数

开始想裸的数位DP,但它不能保证所有的x种数都用上

然后又改的状压DP,dp[i][j] 表示填了i位,使用数的状态为j,

虽然能保证所有的x种数都用上,但数位DP的作用难以体现:

若枚举这一位填哪个数,因为不知道前面填了什么,所以也不能确定这一位填什么

脑补的改进方法是 数位DP加一维表示状态,状压DP加一维表示上一位填了什么

可行性未知

考场错误的状压DP

#include<cstdio>
#include<cstring> using namespace std; int tmp[],num[]; int use[],dp[][];
int a[],b[]; int main()
{
int n,len=;
scanf("%d",&n);
if(n<) { printf(""); return ; }
while(n) { tmp[++len]=n%; n/=;}
for(int i=len,len=;i;i--) num[++len]=tmp[i];
int tot,sum,T; long long ans=;
num[]=;
for(int s=;s<;s++)
{
if(s==)
{
int sad=;
}
memset(use,false,sizeof(use)); tot=;
memset(b,,sizeof(b));
memset(dp,,sizeof(dp));
for(int i=;i<;i++) if(s&(<<i)) tot++,use[i]=true,b[i]=tot;
T=<<tot;
for(int i=;i<=tot;i++) dp[][<<i-]=;
for(int i=;i<len;i++)
for(int t=T-;t;t=t&(t-))
for(int j=;j<=num[i+];j++)
if(use[j]) dp[i+][t|<<b[j]-]+=dp[i][t];
tot=; for(int i=;i<=len;i++) tot+=dp[i][T-];
ans+=1ll*tot*(tot-)/;
if(tot) printf("%d %d\n",s,tot);
}
printf("%I64d\n",ans);
}

考场错误的数位DP

#include<cstdio>
#include<cstring> using namespace std; int tmp[],num[]; int dp[][][][];
bool use[]; int main()
{
int n,len=;
scanf("%d",&n);
if(n<) { printf(""); return ; }
while(n) { tmp[++len]=n%; n/=;}
for(int i=len,len=;i;i--) num[++len]=i;
int S=<<; long long tot,ans=;
for(int s=S-;s;s=s&(s-))
{
memset(use,false,sizeof(use));
memset(dp,,sizeof(dp));
for(int i=;i<;i++)
if(s&(<<i)) use[i]=true;
for(int i=;i<;i++) dp[][i][]=;
for(int i=;i<len;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
if(k)
for(int l=;l<=num[i];l++) dp[i+][l][]+=dp[i][j][];
else
for(int l=;l<;l++)
if(l==num[i]) dp[i+][l][]+=dp[i][j][];
else dp[i+][l][]+=dp[i][j][];
tot=;
for(int i=;i<=len;i++)
for(int j=;j<;j++)
{
tot+=dp[i][j][]+dp[i][j][];
printf("%d %d\n",dp[i][j][],dp[i][j][]);
} ans+=tot*(tot+)/;
}
printf("%I64d\n",ans);
}

30暴力

#include<cstdio>
#include<cstring> bool visx[];
bool visy[]; using namespace std; int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int n;
scanf("%d",&n);
int X,Y,sx,sy,ans=;
bool ok;
for(int x=;x<n;x++)
{
X=x;
while(X)
{
if(!visx[X%]) visx[X%]=true;
X/=;
}
for(int y=x+;y<=n;y++)
{
Y=y;
while(Y)
{
if(!visy[Y%]) visy[Y%]=true;
Y/=;
}
ok=true;
for(int i=;i< && ok;i++)
if(visx[i]!=visy[i]) ok=false;
ans+=ok;
memset(visy,,sizeof(visy));
}
memset(visx,,sizeof(visx));
}
printf("%d",ans);
}

贪心

肯定是上升的时候,越大越好

下降的时候,越小越好

所以有了初步思路:

每次找连续下降的最后一个,然后找连续上升的最后一个,循环往复

看似很正确

但请看下图:

假设k=2,如果按上面的思路,那么后面会选上9

接下来要找连续下降 9后面那个点和8都不满足k=2的差值

所以我们得到的答案=4

但最优解是不要9,选后面的12和8

因为9后面的那个点不能下降,所以到了12仍然是处于上升,所以12比9更优

所以,我们不能找连续的序列,而是

只要现在处于上升阶段,就找最大的

只要现在处于下降阶段,就找最小的

幸亏打了暴力,对拍拍出了这个bug

#include<algorithm>
#include<cstdio>
#include<iostream> #define N 1000001 using namespace std; int e[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("wave.in","r",stdin);
freopen("wave.out","w",stdout);
int n,k;
read(n); read(k);
for(int i=;i<=n;i++) read(e[i]);
bool up=true;
int now,len=;
for(now=;now<=n && e[now+]<=e[now];now++);
int last=e[now++];
while(now<=n)
{
if(!up)
{
while(now<=n)
{
if(last-e[now]>=k) { last=e[now]; len++; up^=; break; }
else if(e[now]>=last ) last=e[now];
now++;
}
}
else
{
while(now<=n)
{
if(e[now]-last>=k) { last=e[now]; len++; up^=; break; }
else if(e[now]<=last) last=e[now];
now++;
}
}
now++;
}
printf("%d",len);
}

对拍代码(n^2)

#include<cstdio>
#include<iostream>
#include<algorithm> #define N 1000001 using namespace std; int f[N][],a[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("data.in","r",stdin);
freopen("std.out","w",stdout);
int n,k;
read(n); read(k);
for(int i=;i<=n;++i) read(a[i]);
int mx,ans=;
for(int i=;i<=n;i++)
{
mx=;
for(int j=i-;j;j--)
if(a[j]-a[i]>=k) mx=max(mx,f[j][]);
f[i][]=mx+; ans=max(ans,f[i][]);
mx=;
for(int j=i-;j;j--)
if(a[i]-a[j]>=k) mx=max(mx,f[j][]);
if(mx)
{
f[i][]=mx+;
ans=max(ans,f[i][]);
}
}
printf("%d",ans);
}

2017 国庆湖南Day2的更多相关文章

  1. 2017 国庆湖南 Day5

    期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...

  2. 2017 国庆湖南 Day6

    期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...

  3. 2017 国庆湖南 Day1

    卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...

  4. 2017 国庆湖南 Day3

    期望得分:100+30+60=190 实际得分:10+0+55=65 到了233 2是奇数位 或223 第2个2是偶数位就会223 .233 循环 #include<cstdio> #de ...

  5. 2017 国庆湖南 Day4

    期望得分:20+40+100=160 实际得分:20+20+100=140 破题关键: f(i)=i 证明:设[1,i]中与i互质的数分别为a1,a2……aφ(i) 那么 i-a1,i-a2,…… i ...

  6. 学大伟业 2017 国庆 Day1

    期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...

  7. 2017国庆 清北学堂 北京综合强化班 Day1

    期望得分:60+ +0=60+ 实际得分:30+56+0=86 时间规划极端不合理,T2忘了叉积计算,用解析几何算,还有的情况很难处理,浪费太多时间,最后gg 导致T3只剩50分钟,20分钟写完代码, ...

  8. 长乐国庆集训Day2

    T1 连珠风暴 题目 [题目描述] 给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链. 问能做成多少种不重复的项链.两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一 ...

  9. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

随机推荐

  1. 【最小生成树+LCA】Imperial roads

    http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...

  2. hdu1010--Tempter of the Bone(迷宫)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Jav ...

  3. ubuntu16.04卸载火狐,Amazon

    一.卸载火狐: . dpkg --get-selections |grep firefox .sudo apt-get purge firefox unity-scope-firefoxbookmar ...

  4. lintcode-420-报数

    420-报数 报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数.如下所示: 1, 11, 21, 1211, 111221, ... 1 读作 "one 1" -> ...

  5. lintcode-411-格雷编码

    411-格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异. 给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序.一个格雷编码顺序必须以 0 ...

  6. 第九章 Mysql函数

    简介 数学函数:处理数字 字符串函数:处理字符串 日期和时间函数:处理日期和时间,获取时间 条件判断函数:控制条件选择 系统信息函数:获取MySQL系统信息,包括数据库名称,当前用户名和数据库版本 加 ...

  7. Java中final修饰符深入研究

    一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很 ...

  8. 【JavaScript】jsp表格页面记录

    页面效果如下: jsp代码如下(里面引入了很多其他js文件,很多方法调用来自其他js): <%@ page language="java" contentType=" ...

  9. list的4种遍历方式

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; import com.hbut.domain.P ...

  10. 【EF】EntityFramework DBFirst的使用

    一.前言        久闻EF大名,之前做C/S产品用的是Dapper对SqlLite进行ORM.然后接触公司授权系统后发现用的是EntityFramework对SQLSever进行ORM.授权系统 ...