2017 国庆湖南Day2
期望得分: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的更多相关文章
- 2017 国庆湖南 Day5
期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...
- 2017 国庆湖南 Day6
期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...
- 2017 国庆湖南 Day1
卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...
- 2017 国庆湖南 Day3
期望得分:100+30+60=190 实际得分:10+0+55=65 到了233 2是奇数位 或223 第2个2是偶数位就会223 .233 循环 #include<cstdio> #de ...
- 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 ...
- 学大伟业 2017 国庆 Day1
期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...
- 2017国庆 清北学堂 北京综合强化班 Day1
期望得分:60+ +0=60+ 实际得分:30+56+0=86 时间规划极端不合理,T2忘了叉积计算,用解析几何算,还有的情况很难处理,浪费太多时间,最后gg 导致T3只剩50分钟,20分钟写完代码, ...
- 长乐国庆集训Day2
T1 连珠风暴 题目 [题目描述] 给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链. 问能做成多少种不重复的项链.两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一 ...
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
随机推荐
- “我爱淘”第二冲刺阶段Scrum站立会议4
完成任务: 完成了首页中的推荐功能,推荐的是最近添加的需要卖的书,注册功能实现了它,可以对数据库进行添加. 计划任务: 在客户端实现分类功能,通过学院的分类查看书籍. 遇到问题: 分类功能,根据不同学 ...
- java锁有哪些类(转)
转载来源:http://www.cnblogs.com/lxmyhappy/p/7380073.html 1.Java都有哪些锁? 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/ ...
- (六)Jmeter重要组件的执行顺序及作用域
一.Jmeter重要组件: 1)配置元件---Config Element: 用于初始化默认值和变量,以便后续采样器使用.配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同 ...
- 在mvc4中上传、导入和导出excel表方法总结
通过excel的导入导出练习,使用NPOI组件还是方便一点,所有下面就以NPOI下的导入导出给出实例,通过网页导入excel表,首先上传,再导入数据到库,这里为了方便就不导入到库中了,直接拿到数据.导 ...
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息
题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...
- String Problem HDU - 3374(最大最小表示法+循环节)
题意: 给出一个字符串,问这个字符串经过移动后的字典序最小的字符串的首字符位置和字典序最大的字符串的首字符的位置,和能出现多少次最小字典序的字符串和最大字典序的字符串 解析: 能出现多少次就是求整个字 ...
- 【刷题】BZOJ 4573 [Zjoi2016]大森林
Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力.小 ...
- [AT2064] [agc005_f] Many Easy Problems
题目链接 AtCoder:https://agc005.contest.atcoder.jp/tasks/agc005_f 洛谷:https://www.luogu.org/problemnew/sh ...
- 【BZOJ1143】祭祀(网络流)
[BZOJ1143]祭祀(网络流) 题面 BZOJ 洛谷 Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大 ...