其他分享
首页 > 其他分享> > 习题:农夫约的假期(分析&中位数)

习题:农夫约的假期(分析&中位数)

作者:互联网

题目

思路

大意了,以为最长的题目是最恶心的题目

原来的魔音值实际上没有影响,因为不管什么方案都要包含这些基础贡献

仔细观察,其中行和列是独立的

考虑行的式子,设选择的点的行为x

那么就有\(ans=\sum|x-x_i|\)

然后?这不是个裸的绝对值不等式的经典式子?

取中位数即可

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
	int x,y;
	long long val;
	friend bool operator < (const node &a,const node &b)
	{
		return a.val>b.val;
	}
}a[100005];
int n,m,z;
int x,y;
long long ans=0;
int f_abs(int x)
{
	return x<0?-x:x;
}
vector<int> v1,v2;
int main()
{
	//ios::sync_with_stdio(false);
	//freopen("shuru.in","r",stdin);
	//freopen("shuru.out","w",stdout);
	cin>>n>>m>>z;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].x>>a[i].y>>a[i].val;
		ans=ans+a[i].val;
		v1.push_back(a[i].x);
		v2.push_back(a[i].y);
	}	
	sort(v1.begin(),v1.end());sort(v2.begin(),v2.end());
	if(m%2==0)
		m=m/2-1;
	else
		m/=2;
	for(int i=0;i<v1.size();i++)
		ans=ans+f_abs(v1[m]-v1[i]);
	for(int i=0;i<v2.size();i++)
		ans=ans+f_abs(v2[m]-v2[i]);
	cout<<ans<<'\n'<<v1[m]<<' '<<v2[m];
	return 0;
}

标签:val,int,中位数,long,v2,ans,习题,include,农夫
来源: https://www.cnblogs.com/loney-s/p/14052891.html