题源:http://acm.uestc.edu.cn/#/problem/show/3

题解:

  题意:播放一段视频文件,有播放速度和缓冲速度两种,因为作者的癖好,播放前要缓冲几秒钟(这段时间不计算在总时间内),如果当播放文件大小等于缓冲文件大小时,缓冲文件还没有缓冲完,播放器会从头开始,但缓冲继续缓冲。

  总结几个关键点:

    1.当需要重新播放的时候,已经缓冲的大小(这里的性质等于开始播放前缓冲的大小),此时的情形类似最开始的情况,只是提前缓冲大小不一样了。

    2.当播放大小等于缓冲大小(这里列一个方程),判断缓冲大小是否大于等于总大小,否则重新播放。

  根据关键点的信息,可以嗅出递归算法的味道,什么是递归算法?

  在数学中,递归是X0属于A集合,f(X0) = f(f(X1)),X0等于在X1对应的因变量。外层需要内层运算的结果

  在编程中,递归是函数自己调用自己,但有一个递归出口。函数调用实际上是在“栈”中进行,最先调用的函数在栈底。

  网上扣一张图能很形象理解递归(如有侵权立即删除)

回归正题:

设播放速度为X,缓冲速度为Y,提前播放的时间T,文件总大小Z,需要的时间t,重新播放前一刻的缓冲大小Size。

1.分两种情况。

  1)网速倍儿棒,一次都没重新播放过

    t = Z/X

    满足条件:缓冲速度Y大于等于播放速度X   或者   当要重新播放的时候,缓冲大小大于总大小

         Y >= X  ||  T/(X - Y) >= S/X

  2)令人抓狂的情况,老是重新播放

    t = t1 + t2 + t3 ... + tn;

    tn = Size/(X-Y);//第N次递归的播放时间

    递归相同式子:缓冲文件大小Size,调用自身函数时,缓冲文件大小变为Size/(X-Y)*X;

    递归终止条件:缓冲文件大小大于等于总文件大小S:size / (X - Y)*X >= S

附上代码:

  1. //C code
  2.  
  3. #include<stdio.h>
  4.  
  5. #define M 1000
  6.  
  7. double Time(double size, int X, int Y, int S);//递归函数
  8.  
  9. int main()
  10. {
  11. int num,X[M],Y[M],S[M],T[M];//X playspeed播放速度,Y bufferspeed缓冲速度,S totalsize文件总大小
  12. int i;//循环参数
  13. scanf("%d", &num);//测试数目
  14. for (i = 0; i < num; i++)
  15. {
  16. scanf("%d %d %d %d", &X[i], &Y[i],&T[i], &S[i]);
  17. }
  18. for (i = 0; i < num; i++)
  19. {
  20. if (X[i] <= Y[i] || T[i] / (double)(X[i] - Y[i]) >= S[i] / (double)X[i])//网速好
  21. {
  22. printf("Case #%d: %.3f\n", i+1, S[i] / (double)X[i]);
  23. }
  24. else//辣鸡网速
  25. {
  26. printf("Case #%d: %.3f\n", i + 1, Time(T[i] * Y[i], X[i], Y[i], S[i]));
  27. }
  28. }
  29. return 0;
  30. }
  31.  
  32. double Time(double size,int X,int Y,int S)//size是重新播放前一刻的缓冲文件大小,作为递归变量
  33. {
  34. double t = 0;
  35. if (size / (X - Y)*X < S)//递归终止条件
  36. {
  37. t = size / (X - Y) + Time(size / (X - Y)*X, X, Y, S);
  38. }
  39. else
  40. {
  41. t = S / (double)X;
  42. }
  43. return t;
  44. }

  

有什么问题欢迎在留言区交流!

BiliBili, ACFun… And More!【递归算法】的更多相关文章

  1. cdoj 03 BiliBili, ACFun… And More! 水题

    Article Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/3 Descr ...

  2. CDOJ 3 BiliBili, ACFun… And More! 模拟

    原题链接:http://acm.uestc.edu.cn/#/problem/show/3 题意: 有个人在看B站视频时有个习惯,就是每当卡住的时候,他总再次从头开始看.另外,他在看视频时会先等待T的 ...

  3. UESTCOJ-BiliBili, ACFun… And More!(水题)

    BiliBili, ACFun… And More! Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Ja ...

  4. github+hexo搭建自己的博客网站(二)更换主题yilia

    开始更换主题,hexo默认的主题是landscape,可以更换为其他的主题yilia主题 详细的可以查看hexo博客的演示:saucxs.github.io 可以查看在github上生成的静态文件:h ...

  5. github pages + Hexo + 域名绑定搭建个人博客增强版

    概述 前面我们用github pages + Hexo 搭建了一个简单版的个人博客系统,但是里面的内容单调,很多功能不够完善,所以我们需要对yelle 的主题进行优化和完善.基本搭建请访问:http: ...

  6. hexo-theme-yilia使用遇到的问题

    该项目的github地址:https://github.com/litten/hexo-theme-yilia 下面是该项目的README.md 在使用过中遇到这么一个问题. 文章不会自动的摘要,显示 ...

  7. 一文解锁BILIBILI、ACFUN等弹幕网站是如何审核视频

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 人工审核对于A站和B站都是很重要的. AcFun稿件审核通行标准(V1.1) 表明,要审核的东西非常多,除了内容本身的合规性.调性,还有画质音质.撞 ...

  8. Python3.5爬虫统计AcFun所有视频,并按各个类别进行Top100排序展示

    前(b)言(b): 前段时间对Python产生了浓厚的兴趣,所以决定入门学习了1个多月,后来某时我需要对tomcat做一个压力测试,于是我想到了用Python写一个压力测试的脚本吧!最后捣鼓出了一个脚 ...

  9. 递归算法经典实例小结(C#实现)

     一 .递归算法简介 在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法. 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往 ...

随机推荐

  1. [模板]LIS(最长上升子序列)

    转载自:最长上升子序列(LIS)长度的O(nlogn)算法 最长上升子序列nlogn算法 在川大oj上遇到一道题无法用n^2过于是,各种纠结,最后习得nlogn的算法 最长递增子序列,Longest ...

  2. 解析config文件 练手代码

    解析一个如下的CONFIG文件 #config.txt #SHTTPD Web 服务器配置文件示例 #侦听端口 ListenPort = 80 #最大并发访问客户端数目 MaxClient = 8 # ...

  3. Python中解码decode()与编码encode()与错误处理UnicodeDecodeError: 'gbk' codec can't decode byte 0xab

    编码方法encoding() 描述 encode() 方法以指定的编码格式编码字符串,默认编码为 'utf-8'.将字符串由string类型变成bytes类型. 对应的解码方法:bytes decod ...

  4. vue项目 调用百度地图 BMap is not defined

    这次老板新接了一个四点半官网页面,使用vue来写.emm……我感觉整个人都不好了,两天半解决了20个静态页面.还好vue写页面简直飞快,遇到一个vue的新坑,使用百度地图. 研究了好一会,总是报错BM ...

  5. 在PowerDesigner中设计物理模型1——表和主外键(转)

    出处:http://www.cnblogs.com/studyzy/archive/2009/12/15/1624899.html 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念 ...

  6. CodeForces 686B Little Robber Girl's Zoo (构造冒泡排序)

    题意:给定一排列,让你通过一个区间交换的方式,完成排序. 析:这个题说了,最多不能超过20000次,而 n 最大才100,那么冒泡排序复杂度为 n * n,才10000,肯定是可以的,所以我们就模拟冒 ...

  7. ZOJ1586 QS Network 2017-04-13 11:46 39人阅读 评论(0) 收藏

    QS Network Time Limit: 2 Seconds      Memory Limit: 65536 KB Sunny Cup 2003 - Preliminary Round Apri ...

  8. Linux系统的运行级的概念

    Linux OS 将操作 环境分为以下7个等级,即 0:关机 1:单用户模式(单用户.无网络) 2:无网络支持的多用户模式(多用户.无网络) 3:有网络支持的多用户模式(多用户.有网络) 4:保留,未 ...

  9. tar.gz 解压

    tar -xzvf .tar.gz tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参数指令! ...

  10. VUE 学习笔记 四 计算属性和监听器

    1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...