zoukankan      html  css  js  c++  java
  • CF Gym 100187A Potion of Immortality (思路,最坏情况的最小损失)

    根据兔子试药情况可以缩小范围,如果死了,不在试过的药里面,如果活着,在试过的药里。

    最糟的情况:

      两个原则  1.能确定魔药所在的范围的尽量大,2.死得兔子尽量多。

    如果当前不知道情况的药n为k的二倍以上,那么基于上面两个原则,试过药的兔子肯定会死。

    没死:范围k,损失的兔子0

    死了:范围n-k,损失的兔子1 (n>2*k) (符合两个原则)

    设r=n%k,经过上述过程,损失了n/k-1只兔子,转移到了当前状态范围w = k+r,

      1.r == 0 那么可以补充一个毒药,变成w=k+1,根据鸽巢原理再死一个就可以确定

      2.r == 1 同上 死一个

      3.r > 1  因为在这种情况下两原则是矛盾的,那么根据试药情况分类         (当时我就沙茶在这里了。。。)

        情况1 兔子没事,范围变成k,同1,再死一个能确定。

        情况2 兔子死了,范围变成r,补充毒药变成k+1,一共死两个。

      所以是死两次

    然而,前面讨论还不全面,注意能补充毒药的前提,如果n == k 没法补充毒药,所以-1。

    注意它给的数据范围 n = 1时是不要试药的。还有k == 1时 经过两原则它是转移到 n = 1的情况,不要试药。

    总结:很考全面思维的能力。然而误解题意的我用什么dp,二分。。。

    #include<cstdio>
    
    
    int main()
    {
        int n, k;
        scanf("%d%d",&n,&k);
        if(n==1){
          printf("0");
        } else
        if(n == k){
            printf("-1");
        }
        else if(k == 1){
            printf("%d",n/k-1);
        } else {
            int r = n%k;
            if(r == 0|| r ==1){
                printf("%d",n/k);
            }
            else printf("%d",n/k+1);
        }
    
        return 0;
    }
  • 相关阅读:
    C++ 单例模式
    单链表快速排序
    美团后台面经
    排序算法及其优化总结
    (转)再谈互斥量与环境变量
    互斥锁和自旋锁
    算法题总结----数组(二分查找)
    Linux里的2>&1的理解
    Ubuntu下开启mysql远程访问
    说说eclipse调优,缩短启动时间
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4657708.html
Copyright © 2011-2022 走看看