2012年常州市“信息与未来“程序设计小能手比赛试题--滑翔翼

题目描述

        小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数组是这样的:

数组
man2855
woman14107

可以先用sort()函数对其进行从大到小排序。这样的话数组man,woman会变成这样:

数组
man8552
woman10741

然后算差值。根据样例,可以发现,这样写差是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;
}

这道题目就这么多。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值