#66. 新年的巧克力棒

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://uoj.ac/problem/66

Description

马上就要到羊年了,羊村一片欢腾,懒羊羊则懒洋洋地躺在草坪上吃新年的巧克力棒。

他手上的巧克力棒是个由 n 个巧克力单元格组成的长度为 n 的长条,现在懒羊羊想把巧克力棒掰开成一个个小单元格。

初始时懒羊羊会把这根巧克力棒丢在草坪上,然后每次懒羊羊会从草坪上拿起一根长度大于 1 的巧克力棒,然后从某两个相邻的单元格的间隙处掰开变成两根巧克力棒,然后把这两根巧克力棒丢在草坪上。懒羊羊初始愉悦值为 0,每次掰开巧克力棒后如果这两根巧克力棒长度相等,那么懒羊羊将提升 1 点愉悦值。

当然,草坪上全是长度为 1 的巧克力棒时懒羊羊就会停止操作。现在懒羊羊想知道,他能获得的愉悦值最多是多少?

Input

一行一个正整数 T。

接下来 T 行,每行一个正整数 n 表示巧克力棒的长度,你需要对每个给出的 n 计算最多能获得的愉悦值。

Output

T 行每行一个整数,表示懒羊羊最多能获得的愉悦值。

Sample Input

5
1
3
4
7
233333333

Sample Output

0
1
3
4
233333319

HINT

题意

题解:

其实这道可以打表+猜的,还是比较简单猜出来(个鬼!

官方题解:

算法一

有20分的数据巧克力棒长度非常小,直接搜索下或者手算就行了。
算法二

对于 n≤1000,我们可以用 DP 解决。 f[i]=max(f[k]+f[i−k]+[k==i−k])。[k=i−k] 表示 k=i−k 时为 1 否则为 0。时间复杂度 O(n2),可以通过前 5 个点获得 50 分。
不靠谱的正解

你需要打个表,然后找规律,就能发现答案是 n−c(n),其中 c(n) 是 n 的二进制表示中 1 的个数。然后就 AC 了!
靠谱的正解

我们用数学归纳法证明上述结论。我们按二进制中 1 的个数归纳。

对于只有一个 1,那么 n=2k,k 是某个正整数,那么显然应该每次折半,递推式是 f[n]=f[n/2]×2+1,解得 f[2k]=2k−1,只损失了1。

现在假设对于 1 的个数比 c(n) 少的都满足这个性质。

我们要证明,对于 1 的个数多于 1 个的时候,我们找到最低位的 1,假设在第 j 位,然后把 n 拆成 2j 和 n−2j,这是最优的。

根据归纳假设,我们只用看怎样能获得更少的 1。我们考虑两个数的加法,可以看作是先分别拆成 2 的整数次幂之和,然后每次找到两个相同的 2k 合并成一个 2k+1。在这个过程中 1 的个数显然是在减少的,所以对于任意 i 均有 c(n)≤c(i)+c(n−i)。而当 i=2j 时可以取到等号,所以这就证明了这个算法的正确性。

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
int Num;
char CH[];
//const int inf=0x7fffffff; //нчоч╢С
const int inf=0x3f3f3f3f;
/* inline void P(int x)
{
Num=0;if(!x){putchar('0');puts("");return;}
while(x>0)CH[++Num]=x%10,x/=10;
while(Num)putchar(CH[Num--]+48);
puts("");
}
*/
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
//************************************************************************************** int main()
{
//freopen("test.txt","r",stdin);
int t=read();
while(t--)
{
int a=read();h
int ans=a;
while(a)
{
a-=a&(-a);
ans--;
}
printf("%d\n",ans);
}
}

马上就要到羊年了,羊村一片欢腾,懒羊羊则懒洋洋地躺在草坪上吃新年的巧克力棒。

他手上的巧克力棒是个由 n 个巧克力单元格组成的长度为 n 的长条,现在懒羊羊想把巧克力棒掰开成一个个小单元格。

初始时懒羊羊会把这根巧克力棒丢在草坪上,然后每次懒羊羊会从草坪上拿起一根长度大于 1 的巧克力棒,然后从某两个相邻的单元格的间隙处掰开变成两根巧克力棒,然后把这两根巧克力棒丢在草坪上。懒羊羊初始愉悦值为 0,每次掰开巧克力棒后如果这两根巧克力棒长度相等,那么懒羊羊将提升 1 点愉悦值。

当然,草坪上全是长度为 1 的巧克力棒时懒羊羊就会停止操作。现在懒羊羊想知道,他能获得的愉悦值最多是多少?

uoj 66 新年的巧克力棒 数学的更多相关文章

  1. 巧克力棒&&新年的巧克力棒

    巧克力棒 题目描述 LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每 ...

  2. [UOJ#351]新年的叶子

    [UOJ#351]新年的叶子 试题描述 躲过了AlphaGo 之后,你躲在 SingleDog 的长毛里,和它们一起来到了AlphaGo 的家.此时你们才突然发现,AlphaGo 的家居然是一个隐藏在 ...

  3. uoj#67. 新年的毒瘤(割顶)

    #67. 新年的毒瘤 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用n个结点m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结 ...

  4. uoj 67 新年的毒瘤 tarjan求割点

    #67. 新年的毒瘤 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 辞旧迎新之际 ...

  5. UOJ66 新年的巧克力棒

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. UOJ#67. 新年的毒瘤

    传送门 练习一下Tarjan的模板. 求一下割点,然后加个约束条件判一下特殊点,剩下的就是所求点. //UOJ 67 //by Cydiater //2016.10.27 #include <i ...

  7. uoj 67 新年的毒瘤 割点

    题目链接: 题目 #67. 新年的毒瘤 问题描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 nn 个结点 mm 条无向边的无向图表示.这个图中有 ...

  8. UOJ #460 新年的拯救计划

    清真的构造题 UOJ# 460 题意 求将$ n$个点的完全图划分成最多的生成树的数量,并输出一种构造方案 题解 首先一棵生成树有$ n-1$条边,而原完全图只有$\frac{n·(n-1)}{2}$ ...

  9. UOJ#351. 新年的叶子 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ351.html 题目传送门 - UOJ351 题意 有一个 n 个节点的树,每次涂黑一个叶子节点(度为 1 ...

随机推荐

  1. Three.js基础探寻五——正二十面体、圆环面等

    除了立方体.平面.球体,Three.js还提供了很多其他几何形状. 1.圆形 CircleGeometry可以创建圆形或者扇形: THREE.CircleGeometry(radius, segmen ...

  2. virsh 命令最新整理。 每个“;”之后是正解

    1,migrate --domain --destURL --dname  --live(热迁移) migrate lf 192.168.16.3 dname 2,managedsave domain ...

  3. php 7.3.3安装问题记录

    1.checking for libzip... not foundconfigure: error: Please reinstall the libzip distribution 参考:http ...

  4. 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  5. udev和rules使用规则

    本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...

  6. leetcode 之Search in Rotated Sorted Array(四)

    描述 Follow up for ”Search in Rotated Sorted Array”: What if duplicates are allowed?    Would this aff ...

  7. POJ 1661 Help Jimmy(二维DP)

    题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...

  8. css 资料链接

    https://tink.gitbooks.io/fe-collections/content/ch03-css/float.html https://css-tricks.com/almanac/p ...

  9. 洛谷 P1359 租用游艇 题解

    题目传送门 这道题还是上模板啦~~SPFA大法好(本人还是懒得打邻接表) 一道橙题: 上代码: #include<bits/stdc++.h> using namespace std; ] ...

  10. Codeigniter的一些优秀实践

    最近准备接手改进一个别人用Codeigniter写的项目,虽然之前也有用过CI,但是是完全按着自己的意思写的,没按CI的一些套路.用在公众的项目,最好还是按框架规范来,所以还是总结一下,免得以后别人再 ...