HDOJ 3233

HDOJ 3233 Download Manager

Problem Description

JiaJia准备下载20,000个文件。如果这些文件一起下载那么所有文件都不能正常下载。所以他找了一个下载器。
设T为要下载的文件数量,下载器会遵循以下原则:
1.最小的文件有最高的优先下载权。所以在刚开始会下载最小的n个文件。如果遇到相同大小的文件,选择文件中剩余量较小的文件进行下载。假设带宽至少有50MB/s,n个文件一定可以同时下载。
2.可用带宽平均分配给所有正在下载的文件。当一个文件被下载完毕之后,它占用的带宽会马上分配给下一个文件;如果除了正在下载的文件再没有其他文件了,这个带宽就会平均分配给所有正在下载的文件。
给出每个文件的大小和下载完成度,你的任务是模拟下载器,计算出下载完所有文件所需时间。

Input

至少会有10组测试数据。
每一组数据的第一行给出三个数值:T (1 <= T <= 20000), n (1 <= n <= 2000 and 1 <= n <= T) 和 B (50 <= B <= 1000)。B表示总带宽(MB/s)。记住,下载器总是同时下载n个文件除非需要下载的文件数量小于n。接下来的T行数据包含一个浮点数S(<20000,整数部分即小数点后至多包括两位小数)和一个整数P (0 <= P <= 100)。这两个数分别表示一个文件的大小(MB)和下载完成百分比。理论上,一个文件的大小或者它的下载完成度是不可能用一个数来表示,但是出于问题考虑,请简单假设这样表示是可以的。最后一组测试数据是T=n=B=0,不考虑这组数据。

Output

对于每一组数据,输出数据组数和下载完所有文件所需时间,单位小时,小数点后用两位小数表示。在每一组测试输出下空出一行。

Sample Input

6 3 90
100.00 90
40.40 70
60.30 70
40.40 80
40.40 85
40.40 88
1 1 56
12.34 100
0 0 0

Sample Output

Case 1: 0.66
(此处空白一行)
Case 2: 0.00

Hint Explanation
在第一组数据中,需要下载6个文件,其中3个文件可以同时下载。最小文件是40.40MB但是却有4个40MB大小的文件(2,4,5,6)。所以下载器会选择4,5,6文件来下载因为这些文件更小。下载文件分配到相同的下载带宽(30MB/s)。这三个文件中6号文件第一个下载完成,接着2号文件开始下载,然后5号文件下载完成。接着3号文件开始下载。

思路

这是一道杂题。关键在于下载文件一直都是满带宽下载的,因为带宽B永远都是被分给所有下载的文件,一旦有文件下载完成,带宽会马上分出去给别的文件下载。
这样直接计算所有未完成的量,除以带宽,就是所需时间。

#include<bits/stdc++.h>

int main(){
    
    
	int T, n, B, num = 1;
	while(scanf("%d %d %d",&T,&n,&B)){
    
    
        if(T==0 || n==0 || B==0) break;
        double s,p,sum=0;
		for(int i=0; i<T; i++){
    
    
            scanf("%lf %lf",&s,&p);
            sum += s*(100-p)*0.01;
		}
		printf("Case %d: %.2f\n\n", num++, sum/B);
	}
    return 0;
}

在HDOJ上,输出double类型时,如果scanf采用%lf,prinf采用%f,提交就选择G++
在G++下,main函数的返回值必须是int

猜你喜欢

转载自blog.csdn.net/qq_46523755/article/details/114699990