zzulioj 1807: 小明在努力 (机智递归)
2015-12-14 22:19
393 查看
1807: 小明在努力
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 97 Solved: 36
SubmitStatusWeb
Board
Description
小明是个很勤劳的孩子,为了挣钱养家糊口,来到了某建筑工地搬砖挣钱。奇怪的包工头让小明把卡车卸下来的那堆砖分成一块一块的(要求任何2块转都要分开)。作为资深搬运工,小明总是每次将一堆砖分为两堆,这时候,所消耗的体力是分完之后的两堆砖数目的差值的绝对值。
现在,已知卡车运来的砖的数目,请告诉小明最少要花费多少体力才能完成包工头所要求的任务呢?
Input
有多组测试数据(不超过120组),每组数据有一个正整数N(N<=10^9),表示卡车运来的砖块的数目。Output
对于每组数据,请输出小明完成任务所需的最少体力数。Sample Input
45
Sample Output
02
#include<stdio.h> #include<string.h> int find(int n) { int sum=0; if(n==1) return 0; if(n%2==0) sum+=find(n/2)*2; else { sum+=find(n/2); sum+=find(n/2+1); sum++; } return sum; } int main() { int n,m; while(scanf("%d",&n)!=EOF) { printf("%d\n",find(n)); } return 0; }
//队友用优先队列写超时。。
#include<iostream> #include<queue> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; struct Node { int v,n; }; queue<Node>dl; int main() { int N; while(~scanf("%d",&N)) { while(!dl.empty()) dl.pop(); int l,r,ans=0; Node a,b; a.v=N;a.n=1; if(N>1)dl.push(a); while(!dl.empty()) { a=dl.front(); dl.pop(); if(a.v%2==0) { while(a.v%2==0) { a.n*=2; a.v/=2; } if(a.v<=1) continue; dl.push(a); continue; } l=(a.v+1)>>1; r=a.v-l; ans+=a.n; if(l>1)a.v=l; dl.push(a); if(r>1)a.v=r; dl.push(a); } printf("%d\n",ans); } return 0; }
相关文章推荐
- 小项目集锦博客目录(不断更新,总结)
- 【Android】在浏览器中打开url链接,打开Service,复习IntDef
- POJ 1474 Video Surveillance (半平面交判断)
- 总结:数据库连接字符串的使用方法
- iOS开发之UICollectionView
- 项目开发技巧之开发文档建立
- project euler 82
- 使用GestureOverlayView控件实现手势识别
- Java多线程总结(2) — 线程生命周期中常用方法
- Struts2的输入验证
- Struts2的输入验证
- 集群-基础知识3
- 大话设计模式 笔记1——简单工厂模式
- 《java多线程编程核心技术》之Timer
- cuda core和sp
- 4-3 简单求和
- Android Studio 常用快捷键
- 56.多线程第三章(重点)
- iOS开发之”人机界面准则“
- 数字和字符串的转换