目录
一、题目描述
二、输入输出样例
三、题目解读
本题其实就是给一堆整数的二维坐标,然后呢需要找一些点按照题目的绝对值要求,要求此点到各坐标的距离总和要最小,最后返回能够找到此点的个数。
四、解题思路
其实在没看到题解以前,确实想不到一个很好的做法。因为这题的标签是一个二分查找的方法,其实真的不应该看标签去做题目。最开始我的思路就是先进行最小距离的二分查找,找到最小的距离以后,再进行最终答案的一个二分,最终找到满足最小距离的最大值就是我们需要找到的答案,但是其实我发现这样的思路在找最小距离的时候有很大可能超时,因为题目的数据很大。所以最终放弃了这个想法。但是其实对坐标敏感的同学应该知道此题的最优解了。其实就是,如果我们输入的n是一个奇数的话,那么毫无疑问的是,最终只可能找到1个点,为什么这么说呢?因为我们单方面的看x,如果要找一个坐标,是距离所有x坐标的距离和最小的话,那么无疑就是x坐标的中位数,同理可知道y坐标也是一样的。因此如果每次的n为一个奇数,那么x,y坐标的中位数锁定的必定只有一个点。那么如果n是偶数呢?偶数的话,x,y的中位数各自有两个,那么那两个坐标围起来的区域所占有的整数坐标就为我们最后的答案啦!大家不妨画画图就可以理解了!
五、完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x[1005],y[1005]; //根据数据来说要开long long不然AC不了哦
int main()
{
ll n,t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
if(n%2)
{
cout<<"1"<<endl;
continue;
}
sort(x+1,x+n+1);
sort(y+1,y+n+1);
ll ans=0;
ans=(x[n/2+1]-x[n/2]+1)*(y[n/2+1]-y[n/2]+1); //小学就学中位数的算法了哦
cout<<ans<<endl;
}
}
六、AC凭证
前面WA的原因就是没有开long long哦,所以做题一定要注意数据上的问题!!!!
七、SORT函数的一些使用心得
其实以前发的博客已经有很多地方使用到了sort(),因为sort函数是一个非常好用的STL内置函数,而且很多博客都有介绍它的用法,所以我大概简单的介绍一下它在算法中的常用算法吧!
①函数格式
sort(a,a+n,com)。其中的a代表某一个数组,n代表数组的长度,这里的a必须从下标0开始才可以,而后面的com代表比较的方式,如果省略的话就有下面的说法。
②默认从小到大的排序方式
③如果从大到小呢?
如果要求一个自己定义的顺序排序,就需要我们写一个bool类型的com函数,例如:
bool内的函数就是表示,前一个数要大于后一个数,也就是说从大到小排序!
④用在结构体很妙!
很多时候,由于贪心思想的需要,我们会定义一个结构题,我们大家知道,结构体里面会存储很多的数字,存储在一个结构体里面的数字都是牵连在一起的,那么就给我们一个启发,如果我们只是按照其中的一个变量去排序,而其他的变量均没有一个排序的要求。例如,我们给每个结构体一个下标,但是最终要按照每个结构体存储的数据排序,输出最后排序后的下标,如何操作呢?
#include<bits/stdc++.h>
using namespace std;
struct stu
{
int data;
int index;
}ss[14];
bool com(stu a,stu b)
{
return a.data<b.data;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>ss[i].data;
ss[i].index=i;
}
sort(ss,ss+n,com);
for(int i=0;i<n;i++)
cout<<ss[i].index<<" ";
}
例如上面的代码,最终测试的结果如下图。
我们可以看到,我们让结构体的数据date部分按照从小到大进行排序,那么下标为4的数据2由于排序当然跑到了第一位,所以最后下标4在第一个,其他的依次类推。上述的方法在以后特别是贪心算法的时候有非常大的用处,今后会有类似的题目进行讲解的!
八、水话
STL里面还有好多好多很好用的函数,以后会在相应的时候给大家写博客,然后也便于自己记住。今天刷这一个题目就是发现真的好多算法题目其实不是难在代码的书写上面,而是难在自己能不能突破一个思维的界限,让自己能够更好的想出一个办法解决每一个题目,这样的思维也不是凭空而来的吧,多写题多积累,加油啊!!!