uoj 66 新年的巧克力棒 数学
#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 新年的巧克力棒 数学的更多相关文章
- 巧克力棒&&新年的巧克力棒
		巧克力棒 题目描述 LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每 ... 
- [UOJ#351]新年的叶子
		[UOJ#351]新年的叶子 试题描述 躲过了AlphaGo 之后,你躲在 SingleDog 的长毛里,和它们一起来到了AlphaGo 的家.此时你们才突然发现,AlphaGo 的家居然是一个隐藏在 ... 
- uoj#67. 新年的毒瘤(割顶)
		#67. 新年的毒瘤 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用n个结点m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结 ... 
- uoj 67 新年的毒瘤 tarjan求割点
		#67. 新年的毒瘤 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 辞旧迎新之际 ... 
- UOJ66 新年的巧克力棒
		本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ... 
- UOJ#67. 新年的毒瘤
		传送门 练习一下Tarjan的模板. 求一下割点,然后加个约束条件判一下特殊点,剩下的就是所求点. //UOJ 67 //by Cydiater //2016.10.27 #include <i ... 
- uoj 67 新年的毒瘤 割点
		题目链接: 题目 #67. 新年的毒瘤 问题描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 nn 个结点 mm 条无向边的无向图表示.这个图中有 ... 
- UOJ #460 新年的拯救计划
		清真的构造题 UOJ# 460 题意 求将$ n$个点的完全图划分成最多的生成树的数量,并输出一种构造方案 题解 首先一棵生成树有$ n-1$条边,而原完全图只有$\frac{n·(n-1)}{2}$ ... 
- UOJ#351. 新年的叶子 概率期望
		原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ351.html 题目传送门 - UOJ351 题意 有一个 n 个节点的树,每次涂黑一个叶子节点(度为 1 ... 
随机推荐
- JS的全局函数eval解析JSON字符串
			JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需. ... 
- 面试中关于Redis的问题看这篇就够了
			昨天写了一篇自己搭建redis集群并在自己项目中使用的文章,今天早上看别人写的面经发现redis在面试中还是比较常问的(笔主主Java方向).所以查阅官方文档以及他人造好的轮子,总结了一些redis面 ... 
- 初识PDO数据库抽象层
			目录: 00x1 php中的pdo是什么? 00x2 pdo创建一个PDO对象 00x1 php中的pdo是什么? 就是操作数据库的方法,pdo就是把操作数据库的函数封装成一个pdo类,其间做了安全验 ... 
- 利用pycharm运行scrapy以及scrapy的配置
			1.安装两个whl文件 https://pypi.python.org/pypi/Twisted 下载Twisted的whl文件 https://pypi.python.org/pypi/Scrapy ... 
- Python 中的闭包与装饰器
			闭包(closure)是函数式编程的重要的语法结构.闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性. 如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数 ... 
- Enumeration的学习
			枚举是jdk5.0之后的新特性.枚举的使用在编程中能起到很大的作用,本文从枚举的适用范围.枚举的特点.枚举的使用等三个方面学习枚举 一.枚举的使适用范围 “在有限的范围内选择值”:比如一个星期只有星期 ... 
- git clone的
			git clone git@e.coding.net:wudi360/*******.git 
- Linux 用户篇——用户管理的配置文件
			一.用户管理之配置文件的重要性 在Linux系统中,用户账户的相关信息是存放在相关配置文件中.而Linux安全系统的核心是用户账号,用户对系统中各种对象的访问权限取决于他们登录系统时用的账户,并且Li ... 
- EasyUi – 5.修改$.messager.show() 弹出窗口在浏览器顶部中间出现
			由于在easyui中$.messager.show() 只有一种弹出方式(在浏览器的或下角弹出),我最近在做一个项目的时候需要在浏览器的顶部中间出现.由于自己写花那么多的时间,所以就去修改了原码(不推 ... 
- 小甲鱼Python笔记(类)
			类和对象 类的构造方法 def __init__(): 1 class People: 2 def __init__(self,name): 3 self.name = name 注意:在构造方法中的 ... 
