Sgu 114 Telecasting station

来源:互联网 发布:iphone画图软件 编辑:程序博客网 时间:2024/05/01 18:30

貌似忘记写题意了

给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 longLL 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-8int 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;}



原创粉丝点击