题意:
就是给你一个n数组,然后对于c数组你可以随意构造。问你第k小的每一项va[i]*vc[i]。
思考:
其实看到我感觉没有什么思路,只是感觉和以前做过的一道题挺像的:dd爱矩阵那道题也是求k小k大的,也是用了队列操作。其实这道题就是,开n个队列,每次用最小值去扩展别人。但是扩展的时候只去扩展后面的,要不然就会重复了没意义。
代码:
int T,n,m,k;
int va[M];
queue<int > q[M];
signed main()
{
IOS;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>va[i];
sort(va+1,va+1+n);
q[1].push(0);
int minn = inf,pos = -1;
for(int i=1;i<=m;i++)
{
minn = inf,pos = -1;
for(int j=1;j<=n;j++)
{
if(q[j].size()&&q[j].front()<minn)
{
minn = q[j].front();
pos = j;
}
}
q[pos].pop();
for(int j=pos;j<=n;j++) q[j].push(minn+va[j]);
}
cout<<minn;
return 0;
}
总结:
多多思考呀。