Codeforces Round #703 (Div. 2)__ B. Eastern Exhibition__ 纯纯的思维

原题链接 https://codeforces.com/contest/1486/problem/B

题目

解题思路

这是个思维题,  算是货仓选址的变式, 想要到达各个点距离最小,我们的目标可以化为先求出分别到x y轴各点的最小值区间,  x坐标轴上满足条件的点数乘以y坐标轴上满足条件的点数. 那么怎么求在x轴坐标与y轴坐标有多少距离之和最小的点的个数呢?

1).n为奇数, 最小值唯一, 答案即为1   

2). 偶数时中位数有两个这时取左右中位数这个闭区间里所有的整数都是最小的,解释: 因为取这个区间里的整数时,你往左边偏一个距离那么左边各个点距离之和减小n/2,右边区间各个点距离之和增加n/2,总体没有变化,最后x坐标轴上满足条件的点数乘以y坐标轴上满足条件的点数, 相当于先求出符合的区间, 再x y轴的相乘。

AC代码

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 int main()
 7 {
 8     int t;
 9     cin >> t;
10     while(t --)
11     {
12         int n;
13         cin >> n;
14         ll x[1010], y[1010];
15         
16         for(int i = 0; i < n; i ++)
17             cin >> x[i] >> y[i];
18         
19         if(n % 2 == 1)
20             puts("1");
21         else
22         {    
23             sort(x, x + n);
24             sort(y, y + n);
25             
26             ll x1 = x[n/2] - x[n/2-1] + 1, y1 = y[n/2] - y[n/2-1] + 1;
27             printf("%lld
", x1 * y1);
28         }
29     }
30     return 0;
31 }

 最后补充下, 看了别人的题解, 有个写法1LL * cnt1 * cnt2  

其中用了1LLLL其实代表long long*1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量。

 
原文地址:https://www.cnblogs.com/la-la-wanf/p/14418747.html