ssoj2454愉快的logo设计(dp)
2015-10-26 15:11
441 查看
【题意】有一个仅有‘J’‘O’‘I’组成的序列,定义:
·S0为’J’,’O’,’I’中任一字符构成的长度为1的字符串
·S[k+1]为最初4^k个字符都是’J’,接下来的4^k个字符都是’O’,接下来的4^k个字符都是’I’,最后4^k个字符是字符串Sk的长为4^(k+1)的字符串
给一个长度为4^k的序列,问最少改变几个字符可以成为sk序列。
【思路】直接做会超时。因为序列连续一段都是相同的字符,用前缀和维护,每次移动4^j(0~k-1)个步长来做。
【代码】
·S0为’J’,’O’,’I’中任一字符构成的长度为1的字符串
·S[k+1]为最初4^k个字符都是’J’,接下来的4^k个字符都是’O’,接下来的4^k个字符都是’I’,最后4^k个字符是字符串Sk的长为4^(k+1)的字符串
给一个长度为4^k的序列,问最少改变几个字符可以成为sk序列。
【思路】直接做会超时。因为序列连续一段都是相同的字符,用前缀和维护,每次移动4^j(0~k-1)个步长来做。
【代码】
<span style="font-size:18px;">#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; const int maxn=1<<21; int k,n,sum[maxn][3],ans; char s[maxn]; inline void getsum(){ for(int i=1;i<=n;++i){ sum[i][0]=sum[i-1][0]; sum[i][1]=sum[i-1][1]; sum[i][2]=sum[i-1][2]; if(s[i]=='J')++sum[i][0]; else if(s[i]=='O')++sum[i][1]; else if(s[i]=='I')++sum[i][2]; } } int main(){ scanf("%d",&k); n=1<<(2*k);ans=n; scanf("%s",s+1); getsum(); for(int i=1;i<=n;++i){ int cnt=0,l=i; for(int j=k-1;j>=0;--j){ int stp=1<<(2*j),r=l+stp-1; if(r>n)r-=n; for(int p=0;p<=2;++p){ if(l<=r)cnt+=stp-sum[r][p]+sum[l-1][p]; else cnt+=stp-sum [p]+sum[l-1][p]-sum[r][p]; l+=stp;r+=stp; if(l>n)l-=n; if(r>n)r-=n; } } ans=min(ans,cnt); } printf("%d\n",ans); return 0; }</span>
相关文章推荐
- golang struct 面向对象
- golang 接口interface{}、断言、switch type
- Google Chrome input 设置 line-height 后光标变得和input一样高
- django web Cookie 和 Sessions 应用
- bapi BAPI_GOODSMVT_CREATE做mb31产品入库
- GO语言教程(一)Windows下Go的安装, 以及HelloWorld
- Django concept
- ActionBar标题Lego显示和项目的桌面图标显示
- 跟着猫哥学Golang[3] - if else
- mongo查询
- django 多站点urls配置
- 跟着猫哥学Golang[2] - 变量
- 跟着猫哥学Golang[6] - 结构体
- go语言vim开发环境快捷键
- django 验证用户是否登陆
- django 验证用户是否登陆
- Django学习-Windows下Django环境配置
- 搭建Django框架
- 九度OJ 1162:I Wanna Go Home(我想回家) (最短路径)
- 九度OJ 1162:I Wanna Go Home(我想回家) (最短路径)