问题描述:
已经凌晨了,在外面玩了一天的cds,现在早已身心俱疲,可它还距离学校的大门整整一公里,于是他就查了一下有没有大巴可以坐
以尽可能的少走路,果然,虽然现在已经很晚,但仍有两辆大巴还在运作,那么问题来了,cds怎样才能使自己走的路最短?
我们假设把路设为一条直线数轴,数轴上有整数点(0,1,2,3,4,……),其中每两点之间相距1m。已知cds在数轴的0点,
而学校在点1000上,两辆大巴的起点和终点分别为x1, y1, x2, y2,其中中途不能下车,车可坐可不坐,且保证能等到车(我们假设cds时间很多)。
输入:
4个正整数x1, y1, x2, y2,数据保证x1<y1, x2<y2, 且都在int范围内,
输出:
一个整数,占一行,表示cds需要步行的最短路程
样例输入:
300 1000 50 301
样例输出:
51
原因分析:
1. 因为for是从1开始的,所以sort第一项应为 a+1 同理最后一项位a+n+1
2.情况
1.坐一辆车 (2种) 2.坐两辆车 3.不坐车
做两辆车同时要分情况讨论 三种情况,第一辆包括第二辆,第一第二辆有交叉,完全不交叉
解决方案:
#include<bits/stdc++.h>
using namespace std;
#define endl"\n"
typedef struct pos{
int x,y;
}p;
bool cmp(p a,p b)
{
return a.x<b.x;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n1,n2,n3,result,i;
p a[4];
for(i=1;i<=2;i++)
cin>>a[i].x>>a[i].y;
sort(a+1,a+3,cmp);
n1=a[1].x+abs(1000-a[1].y);
n3=a[2].x+abs(1000-a[2].y);
if(a[2].y>a[1].y)
n2=a[1].x+abs(a[1].y-a[2].x)+abs(1000-a[2].y);
else
n2=n1;
result=min(n1,1000);
result=min(result,n2);
cout<<min(result,n3)<<endl;
return 0;
}