zoukankan      html  css  js  c++  java
  • 饥饿的小昂

    小昂总是感觉饥饿,所以作为章⻥的小昂经常出去寻找⻉壳吃。最开始小昂在一个初始位置 x 0 。对
    于小昂所处的当前位置x,他只能通过神秘的力量移动到 4x + 3 或者 8x + 7 。因为使用神秘力量要
    耗费太多体力,所以它只能使用神秘力量最多 k 次。⻉壳总生长位置 z ,位置 y
    + z ,位置 2y + z
    等)。小昂需要你帮忙计算最少需要使用多少次神秘力量就能吃到⻉壳。
    输入描述:
    输入四个整数 x 0 , y, k, z .
    x 0 , z, 范围在0 到 y − 1
    输出描述:
    输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到⻉壳,则输出 −1
    输入1
    1 7 100 0
    输出1
    1
    输入2
    2 95 5 0
    输出2
    2
    输入3
    55 999 2000 874
    输出3
    10
    数据范围
    对于30%的数据,有 k
    <= 20
    对于100%的数据,有 x 0 < = 1e9, y <= 1e9, k <= 500000, z <= 1e


    大部分人第一眼看到这题会想到暴力搜索,但是我们仔细推一下x0可以到达的范围,会发现是2^(i)*xo+2^(i)-1(i!=1),于是我们只需要从小到大找到一个满足条件的i即可。

    然后我们再来考虑怎么通过最少的步数来到达这个i。

    我们发现通过题目中给的两种方式一种是i+2,一种是i+3,所以我们很容易的通过贪心来把i分成mod3==0,1,2三种情况,在简单判断一下即可。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    
    #define ll long long
    #define il inline
    #define db double
    
    using namespace std;
    
    ll x0,y,z,ci[1500045];
    int k;
    
    int main()
    {
      freopen("hungry.in","r",stdin);
      freopen("hungry.out","w",stdout);
      cin>>x0>>y>>k>>z;
      k*=3;
      ci[0]=1;
      for(int i=1;i<=k;i++)
        ci[i]=(ci[i-1]<<1)%y;
      for(int i=2;i<=k;i++)
        if((x0*ci[i]%y+ci[i]-1)%y==z)
          {
    	if(i%3==0)
    	  printf("%d
    ",i/3);
    	if(i%3==2||i%3==1)
    	  printf("%d
    ",i/3+1);
    	return 0;
          }
      printf("-1
    ");
      return 0;
    }
    
  • 相关阅读:
    从温设计模式
    php pdf转图片
    PHP 微服务集群搭建
    死磕nginx系列--nginx 限流配置
    分别
    一生悲哀
    三十男人的思考
    test markdown
    linux 系统内核空间与用户空间通信的实现与分析<转>
    ue4 SNew补遗
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/9870720.html
Copyright © 2011-2022 走看看