题型
- 编程 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