1057: 有假币

                               1057:
有假币

时间限制(普通/Java):1000MS/10000MS
  运行内存限制:65536KByte

总提交: 2844
      测试通过:773

描述

居然有假币!!! 

事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。渊子这就去买猪肉,结果找来的零钱中有假币!!!可惜渊子一不小心把它混进了一堆真币里面去了。现在知道假币的重量比真币的质量要轻。给你一个天平,请用最快的时间把那个可恶的假币找出来。

输入

1≤n≤230,输入0结束程序。

输出

最少要称几次一定能把那个假币找出来。

样例输入

3

12

0

样例输出

1

3

提示

示例1中共有3枚硬币,所以任意取2个放天平上称量一下。 
因为假币的重量比较轻。

    • 如果天平不平衡,则较轻的那枚就是假币。

    • 如果天平平衡,则说明这两枚硬币都是真的,而剩下那枚是假币。

  考虑分3堆对该问题最优的特点

做法一:用到了 log 的用法

(int)( log (x) / log (3) )


#include <stdio.h>
#include <math.h>

int f(int x)
{
if(1 == x)
return 0;
else
if(2 == x)
return 1;
else
if(3 == x)
return 1;
else
if(x == (pow(3, (int)( log (x) / log (3)))))
return (log (x) / log (3));
else
return (1 + (int)(log (x) / log (3)));
}

做法2  就是让分3堆的数尽量平均

    


#include <stdio.h>

int main()
{
int n;
while(scanf("%d", &n), n != 0)
{
int count = 0;

while(n != 0)
{
if(1 == n)
break;
else
if(2 == n)
{
count += 1;
break;
}
else
if(3 == n)
{
count += 1;
break;
}
else
{
switch(n % 3)//补充至3堆平均,既取原来分堆后最大的一堆
{
case 0: n /= 3;break;
case 1: n = (n + 2) / 3;break;
case 2: n = (n + 1) / 3;break;
}
count++;
}
}
printf("%d\n", count);

}

return 0;
}

补充一个看到的函数

函数名: ceil

用 法: double ceil(double x);

功 能: 返回大于或者等于指定表达式的最小整数

头文件:math.h

中文名

ceil

    

double ceil

    

返回大于等于表达式的最小整数

头文件

math.h

  对第一种解法的简化

   


#include<stdio.h>
#include<math.h>
int main()
{
int n;
while(scanf("%d",&n),n != 0)
printf("%.0lf\n",ceil(log(n)/log(3.0)));//0.1f很重要
return 0;
}

1057: 有假币,码迷,mamicode.com

时间: 2024-10-11 03:59:45

1057: 有假币的相关文章

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

BZOJ 1057: [ZJOI2007]棋盘制作

Decsription 给你一个矩阵,求最大了 01相间 的矩阵. Sol DP+悬线法. 这是一个论文啊 <浅谈用极大化思想解决最大子矩形问题>--王知昆. 枚举每一根悬线,记录最左/右/上能到达的点,统计答案. Code /************************************************************** Problem: 1057 User: BeiYu Language: C++ Result: Accepted Time:1384 ms Me

lightoj 1057 - Collecting Gold(状压dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其实就是最大的x轴或y轴的差.然后只有15个藏金点状压一下加dfs就行了. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define inf 0X3f3f3f

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

Timus OJ 1057 数位dp

http://acm.timus.ru/problem.aspx?space=1&num=1057 1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine the amount of integers, lying in the set [X;Y] and being a sum of exactlyK different integer degrees of B.

BZOJ 1057 棋盘制作

Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可

POJ 1057 File Mapping 最详细的解题报告

题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘f’开头,文件夹以‘d’开头,‘*’表示一个case的结束,‘#’表示所有输入内容结束. 解题思路:递归创建,最后递归输出.算法比较简单,我就不细说了,具体看代码: 具体算法(java版,可以直接运行) 1 import java.util.*; 2 3 public class Main { 4