题目链接:hdu 5587

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

  然后数位 dp 就行了,

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
#define For(i,s,t) for(int i = s; i <= t; ++i) ull C[][]; // 组合数
inline void init_C(int n) {
For(i,,n) C[i][] = ;
For(i,,n) For(j,,i) {
C[i][j] = C[i - ][j - ] + C[i - ][j];
}
} // dp[i] 表示所有 i 位二进制数里'1'的个数总数,p2[i] 即 i 位二进制数的总个数
ull dp[], p2[] = {, };
inline void init(int n = ) {
init_C(n);
for(int i = ; i <= n; ++i)
for(int j = ; j <= i; ++j)
dp[i] += j * C[i][j];
For(i,,n)
p2[i] = p2[i - ] * ;
} int digit[]; // digit 数组保存的是 x 的二进制表示法
ull solve(ull x) {
int len = ;
while(x) {
digit[++len] = x % ;
x /= ;
}
int num1 = ; // num1 记录的是 digit 里第 i 位前面的'1'的个数
ull res = ;
for(int i = len; i; --i) {
// 只处理第 i 位为'1'的情况就行,'0'的话在该位没有比它更小的了,所以不用处理
if(digit[i] == ) {
// p2[i - 1] * num1 统计的是第 i 位前面的'1'的个数总数(因为此时第 i 位取'0',后面的 i-1 位可以任取)
// dp[i - 1] 统计后面 i-1 位里'1'的个数总数
res += p2[i - ] * num1 + dp[i - ];
++num1;
}
}
return res;
} int main() {
int t;
ull m;
init();
scanf("%d",&t);
while(t--) {
scanf("%I64u",&m);
printf("%I64u\n",solve(m + )); // 因为上面统一处理的是比 x 小的数,所以在这里 +1
}
return ;
}

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

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
const int N = ;
const ull maxLen = 1e16 + ; ull preLen[N], preSum[N]; inline void init(int n = ) {
preLen[] = preSum[] = ;
for(int i = ; i <= n; ++i) {
preLen[i] = preLen[i - ] * + ;
preSum[i] = preSum[i - ] * + (preLen[i] - preLen[i - ]);
if(preLen[i] > maxLen) return ;
}
} ull dfs(ull mlen) {
if(mlen == ) return ;
int pos;
for(int i = ; i <= ; ++i) {
if(mlen < preLen[i + ]) {
pos = i;
break;
}
}
ull remainLen = (mlen == preLen[pos] ? : mlen - preLen[pos] - );
return preSum[pos] + dfs(remainLen) + (mlen - preLen[pos]);
} int main() {
init();
int t;
ull m;
scanf("%d",&t);
while(t--) {
scanf("%I64u",&m);
printf("%I64u\n",dfs(m));
}
return ;
}

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

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

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

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = ;
#define For(i,s,t) for(int i = s; i <= t; ++i) int a[N], b[N]; inline int trans(const int &x) {
return ( * x + ) % ;
} int maxSum(int *b, int n) {
int res = b[], cur = b[];
for(int i = ; i <= n; ++i) {
cur = max(cur + b[i], b[i]);
res = max(res, cur);
}
return max(res, );
} int main() {
int n;
while(~scanf("%d",&n)) {
int sum = ;
For(i,,n) {
scanf("%d",a + i);
sum += a[i];
b[i] = trans(a[i]) - a[i];
}
printf("%d\n", sum + maxSum(b, n));
}
return ;
}

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. Android 自定义ListView

    本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView. 系统显示列表(L ...

  2. 07_编写天气预报和手机归属地的WebService

    <s:element ref="s:schema" /> <s:any /> <s:any minOccurs="2" maxOc ...

  3. Ubuntu14.04安装OpenCV2.4.9

    1.安装依赖 sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev lib ...

  4. 关于在linux中使用图形界面的网络管理工具

    有好几种自动设置的工具可以选择(既然说是自动设置的工具,那就说明有手动设置的工具,例如 使用 ip, iw, iwconfig 这些命令设置网络),例如:Connman, netctl, Networ ...

  5. [liusy.api-SMJ]-MAVEN archetype 创建项目

    •选择或创建工作空间 Select a workspace –File – Switch Workspace - other

  6. java文件编程总结

    文件编程之一就是文件操作,就是新建,删除,复制,更名 新建文件用createNewFile()方法,要处理IOException异常 新建文件夹用mkdirs()方法 删除一个文件和一个空的文件夹直接 ...

  7. 3D数学的实际应用

    以前自己在学习三维程序开发时并没有在意3D数学在程序中的重要作用,但在实际工作中逐渐发现:自己忽视了3D数学的作用,我们实际开发工作总要求模型准确的变换,而不是强调渲染有多炫,那是游戏,如果是仿真程序 ...

  8. EF并非我们想象的那么智能

    我之前在项目中用EF读取一个视图的数据,页面展示出现重复数据,当时百思不得其解,跟踪代码,数据读取时取到的数据并不是重复,为什么在前台显示就有重复了呢,我当时就在业务层将数据去重,但取到的数据跟数据库 ...

  9. FTPClient使用中的问题--获取当前工作目录为null

    使用org.apache.commons.net.ftp.FTPClient 来做ftp的上传下载功能 FTPClient ftp = new FTPClient();ftp.connect(doc. ...

  10. Linux内核分析:dup、dup2的实现

    一.首先需要看一下这两个函数的作用: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 根据m ...