https://vjudge.net/problem/HDU-3233
写完模拟AC后看下题解,发现只是很简单的思维题。(不知道说什么好了
模拟:完全按照题意,读入,sort,用优先队列存储n个同时执行的管道,遍历文件,加入到值最小的管道,最后按照存在的文件数求speed,时间累加至ans
#include <bits/stdc++.h> using namespace std; typedef long long ll; using pdd = pair<double,double>; int main() { ios::sync_with_stdio(false); cin.tie(0); int T,n,B; int cnt = 0; while(cin>>T>>n>>B){ if(T==0 && n==0 && B==0) break; cnt++; cout<<"Case "<<cnt<<": "; vector<pdd> v(T); double S,R; int P; for(int i=0;i<T;++i){ cin>>S>>P; R = (100-P)*S/100; v[i] = make_pair(S,R); } sort(v.begin(),v.end()); priority_queue<double,vector<double>,greater<double>> q; for(int i=0;i<n;++i) q.push(0); for(int i=0;i<T;++i){ R = v[i].second; double t = q.top(); t += R; q.pop(); q.push(t); } double ans = 0; double pre = 0; while(q.size()){ double t = q.top(); double speed = B*1.0/q.size(); ans += (t-pre)/speed; pre = t; q.pop(); } cout<<fixed<<setprecision(2)<<ans<<endl; cout<<endl; } return 0; }
思维转换:因为带宽无论怎样下载都不会有浪费,只是有些文件共享带宽一起下载,有些文件独享带宽单独下载,所以ans=总下载/总带宽
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(false); cin.tie(0); int T,n,B; int cnt = 0; while(cin>>T>>n>>B){ if(T==0 && n==0 && B==0) break; double S; int P; double ans = 0; for(int i=1;i<=T;++i){ cin>>S>>P; ans += S*(100-P)/100; } cnt++; cout<<"Case "<<cnt<<": "; cout<<fixed<<setprecision(2)<<ans/B<<endl; cout<<endl; } return 0; }
ps: 一个月没写博客了...上个月忙于软件杯(学习前端,乱七八糟学了好多,从html/css/js 到jqery vue node,还有http tcp/ip ajax json markdown github linux),然后下半月又准备期中考试(之前一直没怎么听课,补了好久)。
pss: 目前的目标是:cf rating 1179->1600 (div2 A-D div3 A-F)
两方面训练:1.比赛:cf VP:尽量要把最近的div2/3这些我应该做出的题做完,要保证比赛时div2 A-C稳出, div3 A-E稳出,这样基本就能到1600了,D/F也尽量补
atc ABC:按照https://www.cnblogs.com/wawcac-blog/articles/12245307.html 这个帖子的训练方法去板刷B/C题
2.学习:(之前先是洛谷刷官方题单刷不下去,后来又刷蓝书又刷不下去...)这次找到本简单的《算法竞赛入门到进阶》,基本都是hdu的题目,感觉应该还行,一方面把之前学过的专题(排位赛板题)去刷完,另一方面按顺序学和练。(今天这题就是这本书的题库)(https://vjudge.net/article/2033)
原文:https://www.cnblogs.com/FlowRays/p/14737447.html