Sgu 114 Telecasting station

貌似忘记写题意了

给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;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值