题目描述
给定n个a[i],b[i],求min(x$in$R){$sumlimits_{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 }