• 1837 砝码称重


    基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
    小 Q 有 n 个砝码,它们的质量分别为 1 克、 2 克、……、 n 克。
    他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号被人打乱了,即编号为 i 的砝码不一定是 i 克,而是 a_i 克,这里 a 指的是 1 到 n 的一个排列。
    他有一杆天平,可以向天平的两侧放任意数量的砝码,通过一次称量得到两侧质量的大小关系,关系只有左侧重、一样重、右侧重三种可能。
    他想知道,最坏情况下,他至少需要称量多少次,才能确定其中至少一个编号为 i 的砝码的质量是 i 克或不是 i 克。
     
    提示:这里所谓的最坏情况是指,对于固定的、按顺序进行的称量操作,不论每次称量的结果是什么,都能完成所需完成的上述判定任务。
     
    例如 n = 6 时,可以只称量一次,选择编号为 1、 2、 3 的砝码放在左侧,编号为 6 的砝码放在右侧。
    如果天平不是平的,则可以确定存在至少一个砝码 i 不是 i 克 (i = 1, 2, 3, 6),否则编号为 6 的砝码一定是 6 克。
     
    再例如 n = 5 时,可以只称量两次,第一次选择编号为 2、3 的砝码放在左侧,编号为 5 的砝码放在右侧,第二次选择编号为 1、4 的砝码放在左侧,编号为 5 的砝码放在右侧。
    这里略去这样称量的正确性,留给做题人推导和证明。
    Input
    输入包含多组测试数据。
    每行对应一组测试数据,包含一个正整数 n 。
    不超过 10^5 组数据,1 ≤ n ≤ 10^9。
    Output
    每行对应一组测试数据,输出一个正整数表示答案。
    Input示例
    1
    5
    6
    Output示例
    0
    2
    1


    //算法马拉松还是厉害啊,4级题,赛后升5级了。。。结果想了半天,只考虑到部分情况
    51nod 1837 砝码称重
    写得很详细了。。。但是最后一条还是不懂Orz
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define INF 0x3f3f3f3f
     4 #define eps 1e-9
     5 #define LL long long
     6 #define MX 50005
     7 
     8 int main()
     9 {
    10     LL n;
    11     while(scanf("%lld",&n)!=EOF)
    12     {
    13         LL sjx = sqrt(n*2.0-1);
    14         LL pfx = n*(n+1)/2;
    15         LL kk  = sqrt(pfx*1.0);
    16         if (n==1)
    17             puts("0");
    18         else if (sjx*(sjx+1)/2==n||sjx*(sjx+1)/2+1==n)
    19             puts("1");
    20         else if (kk*kk==pfx||kk*kk+1==pfx)
    21             puts("1");
    22         else
    23             puts("2");
    24     }
    25     return 0;
    26 }
    View Code


  • 相关阅读:
    python初接触
    Visual Studio Code 必备插件
    C# 基础知识 -- 枚举(Enum)
    Visual Studio : Console.WriteLine(); 快捷键
    C# 调用Outlook发送邮件
    C# Dos、Unix、Mac文件格式之间的相互转换
    Treeview控件失去焦点,将选择的节点设置为高亮显示
    oracle中的Exists、In、Any、All
    TreeView控件如何控制滚动条的位置
    oracle 查看最大连接数与当前连接数
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/7623873.html
Copyright © 2020-2023  润新知