题目描述
小T和小K都是OIER,入选省队后有幸去苏州参加JSOI集训,训练之余,他们相约一起去苏州乐园玩。
苏州乐园了有一个非常热门的项目叫双人滑翔翼。小T想和小K一起乘双人滑翔翼。但排在他们前面的一大群人却为了搭配问题而争论不休。于是他们便自告奋勇上去替他(她)们排忧解难。
排在小T和小K前面的有N个男人和N个女人。他(她)们希望能一男一女结对飞上天去。由于双人滑翔翼的稳定性决定于两边是否平衡,所以两个人体重差越小就越平衡。现在已知每个人的体重,请将所有人结成N对并使各队体重差的和越小。一对的体重差定义为重的减轻的,此值一定不小于0。
输入
第一行包含一个自然数N(0<N<1001),表示有N对人。
第二行包含N个自然数,表示N个男人的体重。
第三行包含N个自然数,表示N个女人的体重。
输出
包含一个整数,表示配对后N对男女体重差的最小值。
样例组
输入
4
2 8 5 5
1 4 10 7
输出
6
数据范围
30%的数据满足1<=N<=10,体重为不超过10的自然数。
100%的数据满足1<=n<=1000,体重为不超过1000000的自然数。
题目解析
这道题目是一道简单排序性贪心的题目,要做对这道题目主要有两点。
首先,要知道体重差怎么算。根据题目可以得出体重差就是重的减轻的。那体重差的代码该怎么写哪?有两种写法。
第一种写法就是直接借助编译器自带的abs(绝对值)函数。如果把被减数设为男人的体重,这种写法得出的结果就是男人体重减女人重的绝对值,等于体重差。代码实现是这样的:
//设男人体重为man[i],女人体重为woman[i]
体重差=abs(man[i]-woman[i]);
第二种写法则要借助max和min函数。这种写法得出的结果就是男人女人体重的较大值减去较小值,也就是体重差(更直白一些)。代码实现是这样的:
//设男人体重为man[i],女人体重为woman[i]
体重差=max(man[i],woman[i])-min(man[i],woman[i]);
其次,要知道怎么才能得出最优结果(也就是体重差总和最小)。就以样例为例,一开始的man数组,woman数组是这样的:
数组 | ||||
man | 2 | 8 | 5 | 5 |
woman | 1 | 4 | 10 | 7 |
可以先用sort()函数对其进行从大到小排序。这样的话数组man,woman会变成这样:
数组 | ||||
man | 8 | 5 | 5 | 2 |
woman | 10 | 7 | 4 | 1 |
然后算差值。根据样例,可以发现,这样写差是6,和样例输出是一致的。同时也可以发现,不管是什么数据,排序后数组的结果都是最优解。
这样的话就可以避免麻烦的嵌套循环,同时也可以使代码更加简洁,更加简单易懂。
用这种思路写的代码如下:
#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
int man[maxn],woman[maxn],n,ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>man[i];
for(int i=1;i<=n;i++) cin>>woman[i];
sort(man+1,man+n+1);
sort(woman+1,woman+n+1);
for(int i=1;i<=n;i++) ans+=abs(man[i]woman[i]);
//max(man[i],woman[i])min(man[i],woman[i]);
cout<<ans;
return 0;
}
这道题目就这么多。