Download Manager
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 94 Accepted Submission(s): 52
If there are T files to download, the download manger uses the following policy while downloading files:
1. The download manager gives the smaller files higher priority, so it starts downloading the smallest n files at startup. If there is a tie, download manager chooses the one with less bytes remaining (for download). We assume that with at least 50 Mega Bytes/sec of bandwidth, n files can be downloaded simultaneously without any problem.
2. The available bandwidth is equally shared by the all the files that are being downloaded. When a file is completely downloaded its bandwidth is instantaneously given to the next file. If there are no more files left except the files that are being downloaded, this bandwidth is immediately shared equally by all remaining files that are being downloaded.
Given the size and completed percentage of each file, your task is to intelligently simulate the behavior of the download manager to find the total time required to download all the files.
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
Case 1: 0.66 Case 2: 0.00HintExplanation In the first sample, there are 6 files and the download manager can download 3 files simultaneously. The size of the smallest file is 40.40 Megabyte but there are four such files (2nd, 4th, 5th and 6th files). So the download manager chooses the 6th, 5th and 4th files for download as they have less bytes remaining. All these files get equal bandwidth (30.00 Megabyte/Sec). Of these three files the 8th file is finished first. So instantaneously the 2nd file starts downloading. Then, 5th file is finished. So the next larger file (3rd file) starts downloading. This process goes on until all files are downloaded.
Statistic | Submit | Discuss | Back
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const double eps=1e-3;
struct T
{
double sum;
double bf;
} file[20001];
bool cmp(T a,T b)
{
if(a.sum!=b.sum) return a.sum<b.sum;
else return a.bf>b.bf;
}
bool check(double t)
{
if(t==0) return true;
if(t>0&&t<eps) return true;
if(t<0&&t<-eps) return true;
return false;
}
vector<T> q;
int t,n,b,cas=1;
void solve()
{
double tsum=0;
q.clear();
for(int i=0; i<n; i++) q.push_back(file[i]);
int front=n,top=n;
while(!q.empty())
{
front=top;
int si=q.size();
double speed=b*1.0/si;
double tt=100000000.00;
int jishu=0;
for(int i=0; i<q.size(); i++) //找出在队列中哪一个最早被下载完,不一定是第一个
if((q[i].sum*(100-q[i].bf)*0.01)/speed<tt) tt=(q[i].sum*(100-q[i].bf)*0.01)/speed;
for(vector<T>::iterator it=q.begin(); it!=q.end();)
{
//printf("%lf %lf/n",(it->sum*(100-it->bf)*0.01)/speed,tt);
if(check((it->sum*(100-it->bf)*0.01)/speed-tt)) q.erase(it),jishu++;
else
{
//printf("%lf %lf/n",it->bf,(speed*tt)*100/it->sum);
it->bf=it->bf+(speed*tt)*100/it->sum,it++;
}
}
top+=jishu;
for(int i=front; i<top&&top<=t; i++) q.push_back(file[i]);
tsum+=tt;
}
printf("Case %d: %0.2lf/n",cas++,tsum);
}
int main()
{
while(scanf("%d%d%d",&t,&n,&b)!=EOF)
{
if(t==0&&b==0&&n==0) break;
for(int i=0; i<t; i++) scanf("%lf %lf",&file[i].sum,&file[i].bf);
sort(file,file+t,cmp);
if(t<n) n=t;
solve();
puts("");
}
return 0;
}