在计算机组成原理这门课中,小明的老师布置了实现 CPU 流水线的作业。小明打算设计出一个效率最高的流水线。简单来说,流水线就是将 CPU 分成若干个任务模块,而一个模块又可以继续划分成更小的模块,小模块可以划分成更小的小小模块…根据常识我们知道把一个任务划分后,每一个部分的代价会变少,但是可能会产生额外的代价。所以小明希望你帮助他解决这个问题。
每个模块都有一定的时间代价,而流水线最后的效率我们可以用划分的模块数乘上模块中时间代价最大的一个来表示,时间代价越小,流水线的效率越高。也就是说,假如小明最后把 CPU 划分为了 m 个模块,每个模块的代价为 w1,w2,…,wm,则总代价为 m×max(w1,w2,…,wm)。另外,我们认为根节点对应的模块不往下划分模块也是一种合法的方案。
#include<bits/stdc++.h> usingnamespace std; #define int long long inlineintread(){int f=1,x=0;char ch=getchar();while(ch<'0'|| ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} #define N 200010 //#define M //#define mo structnode { int x, y; booloperator <(const node &A) const { return y<A.y; } }p; int n, m, i, j, k, T; vector<int>v[N]; int w[N], f[N], c[N], ans; priority_queue<node>q; //priority_queue<node>q;