一看题目,就知道了这题的算法:一道典型的贪心啊!
我们可以先把p[i]分成两组:一组靠近A市,一组靠近B市
接着把这两组贪心一下就可以得出结果了
代码
for(int i=1;i<=m;i++){
cin>>q>>p;
if(q>p) a[++k].x=q,a[k].y=p;
else b[++s].x=q,b[s].y=p;
}
sort(a+1,a+1+k,cmp);
sort(b+1,b+1+s,cmp);
sort(t+1,t+1+n,cmp1);
now=1;
for(int i=1;i<=k;i++){
if(t[now].j==0) now++;
ans=ans+2*t[now].f*a[i].x+2*(x-t[now].f)*a[i].y;
t[now].j--;
}
now=n;
for(int i=1;i<=s;i++){
if(t[now].j==0) now--;
ans=ans+2*t[now].f*b[i].x+2*(x-t[now].f)*b[i].y;
t[now].j--;
}
一道简单的黄题,建议降橙