P1423 小玉在游泳 题解


以下题解仅供学习参考使用。

抄袭、复制题解,以达到刷AC率/AC数量或其他目的的行为,在洛谷是严格禁止的。

洛谷非常重视学术诚信。此类行为将会导致您成为作弊者。具体细则请查看洛谷社区规则

评论

  • HNFMS__vistonuzi
    666
  • 血舞jerry
    66666666666666 66 66 6 66
  • Doubeecat
    6666666666666
  • Old_fox
    666666666 66 6
  • _谦退_
    666666666666
  • XZRY520
    漂亮!!!!!!!!!!
  • 1836796ad
    炒鸡6
  • 神z在世
    666666
  • SSL_XJQ_逐风之刃
    太棒了
  • Jzyczh
    666666666666
作者: 乌拉 更新时间: 2017-10-31 20:52  在Ta的博客查看    81  

数学方法

O(1)时间复杂度

等比数列求和公式

每次游的距离为上一次的0.98倍,构成一个公比为0.98的等比数列

现要使其前ans项大于等于一个值

只要代入公式并向上取整即可

下附超短代码

#include<bits/stdc++.h>
double x;
int main()
{
    std::cin>>x;
    std::cout<<ceil(log(1-x/100)/log(0.98));
    return 0;
}

评论

  • 佐手牵鼬手
    oj现在好像也可以用了
  • 涅1234凯
    oj一直都不都可以么
  • 题解狗
    OJ一直都可以,我天天用
  • shit_down
    信奥赛的时候可以用吗
  • 和泉sagiri
    可以
  • define_ots
    不错
  • define_ots
    思路差不多
  • define_ots
    OJ可以用啊
  • Porsche
    oj是什么啊?
  • yuxuandeyouxi
    现在奥赛也可以用万能头文件了。。。
作者: 安笙凉城 更新时间: 2017-09-23 21:59  在Ta的博客查看    53  

//这道题非常简单,思路是定义一个变量表示小玉一次的游泳距离,每游一次就把她游一次的距离乘98%,并把游泳次数加一,当游过的距离大于输入的距离时,跳出循环并输出游泳次数。注意输入的距离可能为小数,所以它要定义成浮点数。

include<bits/stdc++.h>//万能头文件,OJ不能用,洛谷还是很开放的。

using namespace std;
int ans=0;//定义的游泳次数。
long double x,s=2,d=0;//x表示输入的距离,s表示小玉一次的游泳距离,d表示她游过的距离。
int main()
{
    cin>>x;
    while(d<x)//循环条件是游过的距离小于输入的距离,如果大于或等于,跳出循环。
      {
          d+=s;//每次加上她游一次的距离。
          s=s/100*98;//因为体力耗损,这一次游的距离为上一次的98%。
          ans++;//游泳次数每次增加一。
      }
    cout<<ans<<endl;//输出答案。
    return 0;//结束。
}

评论

  • 深渊龙谷
    可以,和我的方法差不多
  • 划水运动员
    如果X小于SUM那岂不是ans=0了?
  • zhaoxiyu
    简单
  • Insturction_Iterator
    和楼上的差不多 可以
  • Insturction_Iterator
    等于也应该是可以的·
作者: 瑞星 更新时间: 2017-11-20 21:52  在Ta的博客查看    25  

这是一道很简单的题。内容其实跟级数求和一样

代码如下...

#include<iostream>
using namespace std;
int main()
{
  double x;  cin>>x;  //输入的数据
  double sum=0.0;   //存储游的距离
  int ans=0;             //储存步数
  double tmp=2;     //储存每一步的距离
  while(sum<=x)    //当游的距离还没大于应游的距离时,就执行
  { 
    sum=sum+tmp;  //累加每一步
    tmp=tmp*0.98;   //步数距离更新
    ans++;            //每执行一次循环,步数+1
  }
  cout<<ans<<endl;
  return 0;
}

评论

  • 萝卜_罗瑞淇
    666
  • 落洛
    P党鼓掌
  • XZRY520
    这……100个……输的进去?
作者: ljxljxljx 更新时间: 2017-10-06 22:17  在Ta的博客查看    12  

发现P党的好少,来发一个Pascal

var
i:integer;//记录游了几次。
sum,m,now:real;//简洁的英文(不懂的看一看:sum是存储器,存储游了几米;m是距离;now是这次能游几米。)。
begin
read(m);//读入,不解释。
sum:=2;//第一次能游2米。
now:=2;//同上。
i:=1;//第一次,记录。
while sum<m do//判断,大于等于跳出。
begin
  now:=now*0.98;//这次的游泳长度。
  sum:=sum+now;//共游了几米。
  inc(i);//累加。
end;
write(i);//输出,应该不用解释。
end.

不要抄,理解最重要。 这题不难,模拟一下,自己很容易做出来,一遍过。

(实在不会的可自己把情况输进去,也就100个左右。)

评论

  • 童年如作业
    早期题解,如有不好之处,敬请原谅!
作者: 童年如作业 更新时间: 2017-10-12 13:08  在Ta的博客查看    3  

呵呵,这题得用小数......

不管了,趁还年轻赶紧水一发↖(^ω^)↗↖(^ω^)↗↖(^ω^)↗:

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    double k=2.0,x,l=0.0;//依次为小玉每次游泳距离,x,及计数器;
    cin>>x;
    for(int i=1;;i++)//死循环;
    {
        l+=k;//每次+k;
        if(l>x||l==x)//如果大于或等于x,停止并输出次数i!!!
        {
            cout<<i;
            break;
        }
        k*=0.98;//步长逐渐变短;
    }
    return 0;
}
做这题一定得用两个计数器,一个是步长,一个是距离。