2019/10/22 test 题解

T1

题目描述
给定n个a[i],b[i],求min(x$\in$R){$\sum\limits_{i=1}^{n}$|a[i]*x+b[i]|}

输入格式
第 1行 1个整数 n
第 2行 n个整数,第 i个为 a[i],b[i]

输入格式
输出一行一个实数 y,表示答案。你可以输出任意位小数,随后系统会将你的输出与答案进行比较,只
有当你的输出与答案绝对误差不超过 $10^{-3}$ 时才能得到该测试点的分数

输入样例

2
1 1
2 -1

输出样例

1.50000000000

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define int long long
 7 #define maxn 300000+10
 8 #define INF 2147483647
 9 using namespace std;
10 inline int read() 
11 {
12     int x=0;
13     bool f=1;
14     char c=getchar();
15     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
16     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
17     if(f) return x;
18     return 0-x;
19 }
20 inline void write(int x)
21 {
22     if(x<0){putchar('-');x=-x;}
23     if(x>9)write(x/10);
24     putchar(x%10+'0');
25 }
26 int n;
27 struct node
28 {
29     double a,b,val;
30 }x[maxn];
31 double minn=INF;
32 inline bool cmp(node x,node y)
33 {
34     return x.val<y.val;
35 }
36 inline double cal(double num)
37 {
38     double ans=0;
39     for(int i=1;i<=n;i++)
40     {
41         ans+=abs(x[i].a*num+x[i].b);
42     }
43     return ans;
44 }
45 signed main()
46 {
47     n=read();
48     for(int i=1;i<=n;i++) 
49     {
50         scanf("%lf%lf",&x[i].a,&x[i].b);
51         if(x[i].a==0) continue;
52         int re=x[i].b*-1;
53         x[i].val=double(re)/double(x[i].a);
54     }
55     if(n==1) 
56     {
57         write(0);
58         return 0;
59     }
60     sort(x+1,x+n+1,cmp);
61     double l=x[1].val,r=x[n].val;
62     while(r-l>=1e-8)
63     {
64         double m1=l+(r-l)/3,m2=r-(r-l)/3;
65         if(cal(m1)<cal(m2)) r=m2;
66         else l=m1;
67     }
68     printf("%.8f",cal(l));
69     return 0;
70 }

猜你喜欢

转载自www.cnblogs.com/handsome-zyc/p/11722150.html
今日推荐