洛谷P11376 题解

image
一看题目,就知道了这题的算法:一道典型的贪心啊!
我们可以先把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--;
	}

一道简单的黄题,建议降橙