题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3802

题意: 从数列A中, 删除若干个数(可以0个), 是删除后的数列, 进行类似  Flappy 2048 游戏的运算, 使结果最大, 求该最大值。

题解: 每个数ai, 取或不取, 满足 可用二进制表示。 当 ai < a[i + 1] 是, 易想到 如果两个数都取, ai 将不会在合并。 所以只需考虑ai[i + 1] 前的 降序列即可 .如果没个数都为16, 合并后的数列的最大值为4026 = 2^12。 也就是说, a[i + 1]最多只需考虑 合并到a[i +1]为后的前 12项。

具体的看 代码吧

 /***Good Luck***/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <functional>
#include <cmath> #define Zero(a) memset(a, 0, sizeof(a))
#define Neg(a) memset(a, -1, sizeof(a))
#define All(a) a.begin(), a.end()
#define PB push_back
#define inf 0x3f3f3f3f
#define inf2 0x7fffffffffffffff
#define ll long long
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000") const int mw = << ;
int n;
int arr[mw]; // 滚动数组
int mx;
inline int add(int i, int v) {
int tmp = ((i + v) | i) - i ;
int ans = v;
while (v < tmp) {
ans = ans + (v <<= );
}
return ans;
}
void cal(int v) {
int tmpv;
int tmpmx = ;
for (int i = mx; i >= ; --i) { //mx 记录每次cal 时, 改动的最大值。 (不知为什么, 没优化这一步, 超时, 优化后 10ms,相差好大)
if ((i & (v - ))) {
tmpmx = max(tmpmx, arr[i]); // 记录 arr[i + 1] > arr[i]中的多种情况 下的最大得分。
continue;
}
if (arr[i] && arr[i + v] < arr[i] + (tmpv = add(i,v))) { // 计算并更新arr[i + 1] <= arr[i]中多种情况
arr[i + v] = arr[i] + tmpv;
mx = max(i + v, mx); // 记录该次运行时所用的最大 数。
}
}
arr[v] = v + tmpmx;
mx = max(v, mx);
} int main() {
int T;
scanf("%d", &T);
while (T--) {
Zero(arr);
int val = ;
scanf("%d", &n);
scanf("%d", &val);
mx = val; //第一次的范围
cal(val);
for (int i = ; i <= n; ++i) {
scanf("%d", &val);
cal(val);
}
int ans = ;
for (int i = ; i < mw; ++i) ans = max(ans, arr[i]);
printf("%d\n", ans);
}
return ;
}

最新文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果
  2. 远程ssh登陆时报错:/bin/bash: Permission denied
  3. Android 小笔记
  4. ClamAV安装使用及API例子
  5. 【Origin】答友朋关切书
  6. android开发推荐书籍列表
  7. JBPM学习(五):流程变量
  8. c# 枚举基础有[flags]和没有的的区别
  9. 《算法问题实战策略》——chaper9——动态规划法技巧
  10. [转]Libev教程
  11. 用NodeJS创建一个聊天服务器
  12. NFS服务和DHCP服务讲解(week3_day2)--技术流ken
  13. springboot 前后端分离项目跨域配置
  14. javascript学习笔记(五):异常捕获和事件处理
  15. mysql新版本问题
  16. 数据库操作相关(sql语句-命令行)
  17. 微信公众平台开发之基于百度 BAE3.0 的开发环境搭建(采用 Baidu Eclipse)
  18. 1、认识Redis
  19. Mac休眠之后唤醒时无法使用鼠标
  20. 阅读jQuery源代码带给我们的18个惊喜

热门文章

  1. openssl之aes对称加密
  2. Windows 批量修改文件后缀名
  3. 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
  4. sudo权限造成的故障
  5. NOIP2018货币系统
  6. 07 python学习笔记-写一个清理日志的小程序(七)
  7. 虚拟机kali linux与windows主机共享文件
  8. DP动态规划学习笔记
  9. 合并JSON对象的正确方式
  10. JavaSE语法(中)