题解 饥饿的狐狸

传送门

贪心选一个最大的选一个最小的即可

Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
#define int long long

char buf[1<<21], *p1=buf, *p2=buf;
inline int read() {
	int ans=0, f=1; char c=getchar();
	while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
	while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
	return ans*f;
}

int n, w;
int t[N];

namespace force{
	int ans1=INF, ans2;
	void solve() {
		sort(t+1, t+n+1);
		do {
			int cst1=0, cst2=0, lst=w;
			for (int i=1; i<=n; ++i) {
				cst1+=min(llabs(t[i]-lst), llabs(t[i]-w));
				cst2+=max(llabs(t[i]-lst), llabs(t[i]-w));
				lst=t[i];
			}
			ans1=min(ans1, cst1);
			ans2=max(ans2, cst2);
		} while (next_permutation(t+1, t+n+1));
		cout<<ans1<<' '<<ans2<<endl;
	}
}

namespace task1{
	int ans1, ans2;
	int a[N], b[N], t1, t2, tem[N], tot;
	priority_queue<ll> q;
	void solve() {
		int some_zero=0;
		for (int i=1; i<=n; ++i) {
			if (t[i]>w) a[++t1]=t[i];
			else if (t[i]<w) b[++t2]=t[i];
			else some_zero+=1;
		}
		sort(a+1, a+t1+1, [](int a, int b){return a>b;}); sort(b+1, b+t2+1);

		if (t1) ans1+=a[1]-w;
		if (t2) ans1+=w-b[1];
		// cout<<"ans1: "<<ans1<<endl;
		
		int c=min(t1, t2);
		// for (int i=c+1; i<=t1; ++i) ans2+=llabs(a[i]-w);
		// for (int i=c+1; i<=t2; ++i) ans2+=llabs(b[i]-w);
		for (int i=1; i<=c; ++i) ans2+=2*(llabs(a[i]-w)+llabs(b[i]-w));
		if (t1==t2 && !some_zero) {
			int minn=INF;
			for (int i=1; i<=c; ++i) {
				minn=min(minn, llabs(a[i]-w));
				minn=min(minn, llabs(b[i]-w));
			}
			ans2-=minn;
		}
		for (int i=c+1; i<=t1; ++i) q.push(llabs(a[i]-w));
		for (int i=c+1; i<=t2; ++i) q.push(llabs(b[i]-w));
		if (some_zero) while (q.size() && some_zero) {ans2+=2*q.top(); q.pop(); --some_zero;}
		// while (q.size()) {ans2+=q.top(); q.pop();}
		while (q.size()) {tem[++tot]=q.top(); q.pop();}
		int pos1=1, pos2=tot;
		while (pos1<=pos2) {
			if (pos1==pos2) {ans2+=tem[pos1]; break;}
			else {
				ans2+=tem[pos1];
				ans2+=max(llabs(tem[pos1]-tem[pos2]), tem[pos2]);
				++pos1; --pos2;
			}
		}
		// cout<<"ans2: "<<ans2<<endl;
		printf("%lld %lld\n", ans1, ans2);
		exit(0);
	}
}

signed main()
{
	freopen("a.in", "r", stdin);
	freopen("a.out", "w", stdout);

	n=read(); w=read();
	for (int i=1; i<=n; ++i) t[i]=read();
	// force::solve();
	task1::solve();

	return 0;
}
posted @ 2021-11-17 17:54  Administrator-09  阅读(0)  评论(0编辑  收藏  举报