阿里 2020暑期实习生 笔试回忆

题型

  • 编程 2道 60min

编程1: 修水渠

给若干点的坐标,代表每一个村子,现在要修一条平行于y轴且无限长的水渠,求所有村庄距离这条水渠垂直长度之和的最小值。

  • 输入:n代表村庄的个数,接下来n行,每行2个数,代表村庄的坐标,x>=0,y<=10000
  • 输出:一个数,代表最小距离
  • 思路:想了一下好像和纵坐标没关系,然后拿笔试了试,认定水渠的x值必是和某一村庄的x相同(感觉有点被给出的样例误导),然后就开始了错误的解题过程。。。
    后来想了一下,暴力解的话,可以从最左边的村庄位置开始,不断x+=1遍历到最右边的村庄位置,得到最小距离,优化的话,在第i-1和第i个村庄之间的距离,dis = dis - ( n - i ) + i,即dis = dis + 2i -n,每向右增加一各单位距离,左边的所有村庄距离水渠位置都+1,右边的所有村庄距离水渠位置都-1 。
    找几个用例手工算的话,发现如果村庄的数量是奇数,就选中间的村庄,是偶数,就选第n/2和第n/2+1个村庄之间的任意位置,实际上这两个村庄的位置也是最小位置,这么说来不论怎么选最小位置还是在某个村庄的位置,那么问题来了,为什么没有通过测试用例。。。忘记排序了。。。想哭
#include<iostream>
#include<vector>
#include<algorithm>
#include<climits>
#include<cmath>

using namespace std;

int main(){
   
	int n;
	cin >> n ;
	vector<int> x(n);
	vector<int> y(n);
	for (int i = 0; i < n; i++)
		cin >> x[i] >> y[i];
	//初始化长度
	int curr = 0
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值