Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 94 Accepted Submission(s): 52
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;
}