博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu3147 [USACO16OPEN]262144
阅读量:5294 次
发布时间:2019-06-14

本文共 1320 字,大约阅读时间需要 4 分钟。

Bessie喜欢在手机上下游戏玩,然而她蹄子太大,很难在小小的手机屏幕上面操作。

她被她最近玩的一款游戏迷住了,游戏一开始有n个正整数,(2<=n<=262144),范围在1-40。在一步中,贝西可以选相邻的两个相同的数,然后合并成一个比原来的大一的数(例如两个7合并成一个8),目标是使得最大的数最大,请帮助Bessie来求最大值。

分析题意

首先我们知道这个游戏叫做2048,对于262144这个看起来就不一般的数字来一个log2,log2262144=18

所以答案的范围一定在40+18=58以内

所以就可以开始乱搞优化了

类倍增

1 #include
2 using namespace std; 3 const int maxn=1e6+5; 4 const int INF=1e9+7; 5 int n,ans,dp[262145][60],t; 6 template
void red(t &x) 7 { 8 x=0; 9 int w=1;10 char ch=getchar();11 while(ch<'0'||ch>'9')12 {13 if(ch=='-')14 w=-1;15 ch=getchar();16 }17 while(ch>='0'&&ch<='9')18 {19 x=(x<<3)+(x<<1)+ch-'0';20 ch=getchar();21 }22 x*=w;23 }24 void input()25 {26 freopen("input.txt","r",stdin);27 }28 void read()29 {30 red(n);31 for(int i=1;i<=n;++i)32 {33 red(t); 34 dp[i][t]=i+1;35 }36 }37 void work()38 {39 for(int j=2;j<=58;++j)40 for(int i=1;i<=n;++i)41 {42 if(!dp[i][j])43 dp[i][j]=dp[dp[i][j-1]][j-1];44 if(dp[i][j])45 ans=j;46 }47 printf("%d",ans);48 }49 int main()50 {51 //input();52 read();53 work();54 return 0;55 }
View Code

 

转载于:https://www.cnblogs.com/Achensy/p/10804621.html

你可能感兴趣的文章
iOS View自定义窍门——UIButton实现上显示图片,下显示文字
查看>>
RGB的三维模型与渐变色-颜色系列之一
查看>>
Android Fragment 基本介绍
查看>>
ViewDragHelper练习使用
查看>>
Android 浅谈相机研发
查看>>
android之TabWidget选项卡
查看>>
文件属性windows server 2008的NTFS文件系统管理
查看>>
ASP.Net MVC3连接SAP实践
查看>>
uploadify+C#实例
查看>>
合并两个有序数组(C++)
查看>>
Java内部类的作用
查看>>
编程漫谈(十六):设计与编程
查看>>
android 隔几秒再执行
查看>>
bzoj1798维护序列
查看>>
Xcode7 真机调试的步骤 以及遇到一些的问题
查看>>
java中try 与catch的使用
查看>>
MipMap贴图原理
查看>>
AJAX 基础知识
查看>>
HTML光标样式
查看>>
ACM-渊子赛马
查看>>