A Traveling Salesman Problem
题意简述:
在坐标平面中,给你 n n n 个点,这些点只在 x x x 轴或 y y y 轴上,求从 ( 0 , 0 ) (0,0) (0,0) 点出发,经过所有的点,再回到 ( 0 , 0 ) (0,0) (0,0) 点的最短距离。
此题的关键就是:出发点和终点都在 ( 0 , 0 ) (0,0) (0,0) ,所以会形成一条闭合的回路。
通过观察题目中给的样例解释,容易发现,这条回路可以平移成一个矩形,但样例中每条射线上最多只有一个点,那么多个点能不能平移成矩形呢?
对于多个点,这是成立的,路径通过平移构成一个矩形(至于为什么,请读者思考)。
长度也很好计算,这个矩形的长为 x x x 轴上两个最远的点之间的距离,同理,宽为 y y y 轴上两个最远的点之间的距离。
code:
min1=min2=max1=max2=0;//初始值要给0,因为有可能存在某条射线上没有点
for(i=1;i<=n;i++)
{
cin>>x>>y;
min1=min(min1,x);
max1=max(max1,x);
min2=min(min2,y);
max2=max(max2,y);
}
ans=2*(max1-min1+max2-min2);
B Optimal Reduction
题意简述:
给定一个长度为 n n n 的正整数数组 a a a ,每次可以使 a l , a l + 1 , ⋯ , a r 减 1 ( 1 ≤ l ≤ r ≤ n ) a_l,a_{l+1},\cdots,a_r \text{减}1\ (1\le l\le r\le n) al,al+1,⋯,ar减1 (1≤l≤r≤n) 。记 f ( a ) f(a) f(a) 表示将 a a a 数组中的元素全部更改为 0 0 0 的最小次数。对于 a a a 的任意一个排列 b b b ,求是否存在 f ( a ) ≤ f ( b ) f(a)\le f(b) f(a)≤f(b) 。
朴素想法:
枚举每个 b b b ,判断是否 f ( b ) ≤ f ( a ) f(b)\le f(a) f(b)≤f(a) ,但是 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105 ,这样做铁定 T L E TLE TLE 。
我们不妨求能否构造一个 b b b ,使得 f ( b ) < f ( a ) f(b)<f(a) f(b)<f(a) 。
通过测试样例容易发现,对于给定的数组 a a a ,如果存在 a i < max 1 ≤ k < i a k a_i < \max \limits_{1\le k<i }a_k ai<1≤k<imax