貌似忘记写题意了
给x,p
找到x0使得∑abs(xi-x0)*pi min
实际上就是一个中位数的东西
不想写中位数了
又写的三分=,=
表示叉姐说的是对的...有数据可以卡三分
比如区间段
121[1] 1111 [1]111
和
111[1] 1111 [1]121
无论怎么写必然会有一个会挫掉
不过sgu114整数和实数都过了
表示一般情况下没人闲的来卡这种东西....
整数版2Y
1WA在tp未更新....
#include<stdio.h>
#define N 15010
#define eps 1e-8
#define LL long long
LL x[N],p[N];
int n;
LL abs(LL y){if(y>0)return y;return -y;}
LL f(LL xx){
LL res=0;
for(int i=1;i<=n;i++)res+=abs(x[i]-xx)*p[i];
return res;
}
LL Find3(LL l,LL r){
LL x=r-l;
if(x<3){
LL p=l+1,q=l+2;
LL fl=f(l),fp=f(p),fq=f(q);
LL temp=l,tp=fl;
if(fp<tp)temp=p,tp=fp;
if(fq<tp)temp=q,tp=fq;
return temp;
}
else {
x/=3;
LL ll=l+x,rr=r-x;
LL fll=f(ll),frr=f(rr);
if(fll<frr)return Find3(l,rr);
else return Find3(ll,r);
}
}
int main(){
while(scanf("%d",&n)!=EOF){
int i;
LL max=(int)-1e18,min=(int)1e18;
for(i=1;i<=n;i++){
scanf("%lld%lld",&x[i],&p[i]);
if(x[i]>max)max=x[i];
if(x[i]<min)min=x[i];
}
LL res=Find3(min,max);
printf("%.5lf\n",(double)res);
}
return 0;
}
实数版
1Y
#include<stdio.h>
#define N 15010
#define eps 1e-8
int x[N],p[N];
int n;
double abs(double y){if(y>0)return y;return -y;}
double f(double xx){
double res=0;
for(int i=1;i<=n;i++)res+=abs(x[i]-xx)*p[i];
return res;
}
double Find3(double l,double r){
// printf("find3(%lf,%lf)\n",l,r);
double x=r-l;
if(x<eps)return l;x/=3.0;
double ll=l+x,rr=r-x;
// printf("ll=%lf,rr=%lf\n",ll,rr);
double fll=f(ll),frr=f(rr);
// printf("fll=%lf,frr=%lf\n\n",fll,frr);
if(fll<frr)return Find3(l,rr);
else return Find3(ll,r);
}
int main(){
while(scanf("%d",&n)!=EOF){
int i;
double max=-1e18,min=1e18;
for(i=1;i<=n;i++){
scanf("%d%d",&x[i],&p[i]);
if(x[i]>max)max=x[i];
if(x[i]<min)min=x[i];
}
// printf("%lf %lf\n",max,min);
double res=Find3(min,max);
printf("%.5lf\n",res);
// while(scanf("%lf",&res)!=EOF&&abs(res)>eps)printf("%lf\n",f(res));
}
return 0;
}