BiliBili, ACFun… And More!【递归算法】

题源: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

附上代码:

//C code

#include<stdio.h>

#define M 1000

double Time(double size, int X, int Y, int S);//递归函数

int main()
{
	int num,X[M],Y[M],S[M],T[M];//X playspeed播放速度,Y bufferspeed缓冲速度,S totalsize文件总大小
	int i;//循环参数
	scanf("%d", &num);//测试数目
	for (i = 0; i < num; i++)
	{
		scanf("%d %d %d %d", &X[i], &Y[i],&T[i], &S[i]);
	}
	for (i = 0; i < num; i++)
	{
		if (X[i] <= Y[i] || T[i] / (double)(X[i] - Y[i]) >= S[i] / (double)X[i])//网速好
		{
			printf("Case #%d: %.3f\n", i+1, S[i] / (double)X[i]);
		}
		else//辣鸡网速
		{
			printf("Case #%d: %.3f\n", i + 1, Time(T[i] * Y[i], X[i], Y[i], S[i]));
		}
	}
    return 0;
}

double Time(double size,int X,int Y,int S)//size是重新播放前一刻的缓冲文件大小,作为递归变量
{
	double t = 0;
	if (size / (X - Y)*X < S)//递归终止条件
	{
		t = size / (X - Y) + Time(size / (X - Y)*X, X, Y, S);
	}
	else
	{
		t = S / (double)X;
	}
	return t;
}

  

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

时间: 2024-11-06 12:31:54

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

cdoj 03 BiliBili, ACFun… And More! 水题

Article Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/3 Description Some of you may have already noticed, there is a team in our final contest whose name is UESTC_BiliBilii, with user id as ACfun. Actually, both

CDOJ 3 BiliBili, ACFun… And More! 解题报告

好吧,我还是回来了,竞赛结束后也没怎么碰那个unnamed.space了,现在早就已经过期了.同样的几个月没有碰OI了,手明显生疏很多,毕业了重新搞搞OI吧,想必落下了很多. 高考考得很渣,不过很荣幸自主招生进了电子科技大学某郫县男子技校,于是去他们的OJ上围观了一下,随便做几题玩玩. 嘛,嘛,不提了,我来讲讲CDOJ 3的大致做法,很明显的追及问题,因为数据很小,\(O(n)\)暴力可过,然而推公式的话,也是有\(O(1)\)的做法的. 这里我没有用暴力(我是做完后对拍才到网上搜到的暴力做法…

CDOJ 3 BiliBili, ACFun… And More! 模拟

原题链接:http://acm.uestc.edu.cn/#/problem/show/3 题意: 有个人在看B站视频时有个习惯,就是每当卡住的时候,他总再次从头开始看.另外,他在看视频时会先等待T的时间.现在给出播放的速度X和下载的速度Y,总长度S,问你他需要多少时间才能把整个视频都看完. 题解: 不断的跑追击问题就好,不过需要注意边界的情况. 代码: #include<iostream> #include<cstring> #include<algorithm> #

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

BiliBili, ACFun… And More! Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Some of you may have already noticed, there is a team in our final contest whose name is UESTC_BiliBilii, with user id as ACfun. Actually,

天了噜,已经在颓废的深渊里出不来了嘛

我现在的状况呢就是感觉特别寂寞,都要20岁了,还没谈过恋爱,见了女生会脸红,真是够了. 不过也有一部分原因是因为我当前的事业不行啦,朋友都工作了,我还是啃老状态.嘛,我现在发这个随笔也是因为这个原因,很失落,完不成今天的任务,对自己没信心了呗.和我看到的公开课一个道理吧,通过肢体语言为自己增加自信,有了自信干起活来特别愉悦,良性循环. okok,说重点吧.qq,weibo,wechat,tieba,qzone一律不关注啦,wechat主动弹给我的信息除外,毕竟我姐姐没我手机号,只有这个能联系咯.

视频网站的盈利模式分析

一. 由于各种客观非客观因素,我国的视频网站和欧美发达国家的视频网站的盈利模式相比还是有很大差别的,接下来就简单的分析介绍一下欧美和国内视频网站盈利模式. 因为对国外的视频网站不是很了解,所以在这里只能简单地介绍一下国外视频网站不同于国内的盈利方式,欧美在版权这方面做得很完善,所以国外的视频网站可以通过购买某部(或某些)电影/剧集的网络播放权/网络首播权,之后通过收费收看这样的方式,为自己的网站的盈利渠道并提升浏览量,比如<越狱><冰与火之歌>等十分热门,但确只能在收费频道播放的剧

新浪微博、AcFun、凤凰网的视频要被关了?只因它们没有这个……

6月22日,国家新闻出版广电总局发布消息,要求"新浪微博"."ACFun"等网站关停视听节目服务,全文如下: 针对"新浪微博"."AcFun"."凤凰网"等网站在不具备<信息网络传播视听节目许可证>的情况下开展视听节目服务,并且大量播放不符合国家规定的时政类视听节目和宣扬负面言论的社会评论性节目,国家新闻出版广电总局于近日发函责成属地管理部门,按照<互联网视听节目服务管理规定>(广电

汉诺塔递归算法

利用递归算法: 第一步:将n-1个盘子移到B 第二步:将第n个盘子移到C 第三步:将n-1个盘子移到C #include<iostream> using namespace std; int count=0; void move(int n,char a,char b) //n表示盘子号a表示盘子的起始位置 b表示盘子到达的位置 { cout<<a<<"->"<<b<<endl; count++; } void towe

对递归算法的理解

1.递归的定义:程序调用自身的编程技巧称为递归.递归做为一种算法在程序设计语言中广泛应用.一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. 2.递归的优点:代码简