题目链接:hdu 5587

  前两周 bc 上的题了,因为赶大作业所以没有去打,看了下官方给出的思路,感觉好强大~~竟然能转化成求二进制数 1 的个数:

  然后数位 dp 就行了,

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef unsigned long long ull;
  6. #define For(i,s,t) for(int i = s; i <= t; ++i)
  7.  
  8. ull C[][]; // 组合数
  9. inline void init_C(int n) {
  10. For(i,,n) C[i][] = ;
  11. For(i,,n) For(j,,i) {
  12. C[i][j] = C[i - ][j - ] + C[i - ][j];
  13. }
  14. }
  15.  
  16. // dp[i] 表示所有 i 位二进制数里'1'的个数总数,p2[i] 即 i 位二进制数的总个数
  17. ull dp[], p2[] = {, };
  18. inline void init(int n = ) {
  19. init_C(n);
  20. for(int i = ; i <= n; ++i)
  21. for(int j = ; j <= i; ++j)
  22. dp[i] += j * C[i][j];
  23. For(i,,n)
  24. p2[i] = p2[i - ] * ;
  25. }
  26.  
  27. int digit[]; // digit 数组保存的是 x 的二进制表示法
  28. ull solve(ull x) {
  29. int len = ;
  30. while(x) {
  31. digit[++len] = x % ;
  32. x /= ;
  33. }
  34. int num1 = ; // num1 记录的是 digit 里第 i 位前面的'1'的个数
  35. ull res = ;
  36. for(int i = len; i; --i) {
  37. // 只处理第 i 位为'1'的情况就行,'0'的话在该位没有比它更小的了,所以不用处理
  38. if(digit[i] == ) {
  39. // p2[i - 1] * num1 统计的是第 i 位前面的'1'的个数总数(因为此时第 i 位取'0',后面的 i-1 位可以任取)
  40. // dp[i - 1] 统计后面 i-1 位里'1'的个数总数
  41. res += p2[i - ] * num1 + dp[i - ];
  42. ++num1;
  43. }
  44. }
  45. return res;
  46. }
  47.  
  48. int main() {
  49. int t;
  50. ull m;
  51. init();
  52. scanf("%d",&t);
  53. while(t--) {
  54. scanf("%I64u",&m);
  55. printf("%I64u\n",solve(m + )); // 因为上面统一处理的是比 x 小的数,所以在这里 +1
  56. }
  57. return ;
  58. }

  网上好像有很多思路可以递归或者递推找规律的,我学习了下,感觉也很强大:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef unsigned long long ull;
  6. const int N = ;
  7. const ull maxLen = 1e16 + ;
  8.  
  9. ull preLen[N], preSum[N];
  10.  
  11. inline void init(int n = ) {
  12. preLen[] = preSum[] = ;
  13. for(int i = ; i <= n; ++i) {
  14. preLen[i] = preLen[i - ] * + ;
  15. preSum[i] = preSum[i - ] * + (preLen[i] - preLen[i - ]);
  16. if(preLen[i] > maxLen) return ;
  17. }
  18. }
  19.  
  20. ull dfs(ull mlen) {
  21. if(mlen == ) return ;
  22. int pos;
  23. for(int i = ; i <= ; ++i) {
  24. if(mlen < preLen[i + ]) {
  25. pos = i;
  26. break;
  27. }
  28. }
  29. ull remainLen = (mlen == preLen[pos] ? : mlen - preLen[pos] - );
  30. return preSum[pos] + dfs(remainLen) + (mlen - preLen[pos]);
  31. }
  32.  
  33. int main() {
  34. init();
  35. int t;
  36. ull m;
  37. scanf("%d",&t);
  38. while(t--) {
  39. scanf("%I64u",&m);
  40. printf("%I64u\n",dfs(m));
  41. }
  42. return ;
  43. }

  因为不是比赛时做,所以时间比较充裕,变量名写得有点长了,看着像在写工程代码

  这题,必须好好琢磨才行,它和刚过去的 2015CCPC 南阳的热身赛的第一题很像,都是递归的思想,当时现场想不出来,却被身旁的师弟秒掉了,好惭愧的感觉 -_-||   看来自己还要勤加练习啊,弱渣就需多努力~

  顺便贴一下 5586 Sum 的代码,自己1A掉的:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = ;
  6. #define For(i,s,t) for(int i = s; i <= t; ++i)
  7.  
  8. int a[N], b[N];
  9.  
  10. inline int trans(const int &x) {
  11. return ( * x + ) % ;
  12. }
  13.  
  14. int maxSum(int *b, int n) {
  15. int res = b[], cur = b[];
  16. for(int i = ; i <= n; ++i) {
  17. cur = max(cur + b[i], b[i]);
  18. res = max(res, cur);
  19. }
  20. return max(res, );
  21. }
  22.  
  23. int main() {
  24. int n;
  25. while(~scanf("%d",&n)) {
  26. int sum = ;
  27. For(i,,n) {
  28. scanf("%d",a + i);
  29. sum += a[i];
  30. b[i] = trans(a[i]) - a[i];
  31. }
  32. printf("%d\n", sum + maxSum(b, n));
  33. }
  34. return ;
  35. }

hdu 5587 Array的更多相关文章

  1. hdu 5587 Array 数学题

    Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5587 De ...

  2. hdu 5587 Array 二分

    Array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem ...

  3. HDU 5587——Array——————【规律】

    Array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  4. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  5. HDU 5587:Array

    Array  Accepts: 118  Submissions: 232  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072/ ...

  6. HDU 6197 array array array 2017沈阳网络赛 LIS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197 题意:给你n个数,问让你从中删掉k个数后(k<=n),是否能使剩下的序列为非递减或者非递增 ...

  7. hdu 6197 array array array

    array array array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6172 题意:如题. 解法: #include <bits/stdc++.h> using ...

  9. hdu 6197 array array array LIS

    正反跑一次LIS,取最大的长度,如果长度大于n-k就满足条件. ac代码: #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. JavaScript中数组操作常用方法

    JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...

  2. apt-get update : pulic key error

    apt-get update  出现 这种错误 Reading package lists... Done W: There is no public key available for the fo ...

  3. Android爬坑之路

    做了那么久前端,现在终于可以回到我的老本行, 今天我用了一天的时间配置里Android开发环境,mac和windows双平台,eclipse和IDEA双平台,别问为什么,我就喜欢,中间大坑不断,再加上 ...

  4. Maximo7自定义实现WebService

    最近很多人在群里聊这个话题,我就也一个hello world来实现一下. 1.自定义一个类,继承于AppService 代码如下:

  5. Oracle Contact By的使用

    1.概述 Oracle “CONNECT BY”是层次查询子句,一般用于树状或者层次结果集的查询 2.使用方式 2.1.通过Connect by 生成序列 Oracle 构造一个月份的天数 ) s_d ...

  6. xutils3

    使用方法:https://github.com/wyouflf/xUtils3 http://blog.csdn.net/tyk9999tyk/article/details/53306035 .Ne ...

  7. git的一些命令行

    以下代码均在命令行中执行:在目标文件夹目录下: 1.初始化一个Git仓库,使用git init命令. 2.添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意 ...

  8. 对魔兽世界、支付宝、Linux三类软件的简单分析

    软工第一次作业: 软件有很多种,如工具类软件.游戏类软件.系统类软件,它们的运行方式也各种各样,如以单机方式运行.以网站方式运行或者以APP方式运行在手机端等,请选取三种软件,分析它们各自的特点. 这 ...

  9. readline,readlines,read函数

    readline是读取每一行,包括'\n'.读出来是一个含'\n'的字符串. realines是读取整个文件,返回所有行的一个list(写代码的时候你需要一个文件的某几行,就可以用这个函数去切分) r ...

  10. [转]Part2: Understanding !PTE, Part2: Flags and Large Pages

    http://blogs.msdn.com/b/ntdebugging/archive/2010/04/14/understanding-pte-part2-flags-and-large-pages ...