列表

详情


NC15403. wyh的曲线

描述

给你三组数列,分别为

现在给你一个式子:

然后我们可以将这个函数画在一个xoy直角坐标系下,x的范围为[0,100],当然我们可以得到一条曲线,现在你们涵哥让你们求出这个曲线的长度,结果保留两位小数

输入描述

单组输入:

每组测试数据第一行输入一个整数n。

接下来n行,每行3个数代表

Data limit:

输出描述

对于每组测试数据,输出对应答案,结果保留两位小数

示例1

输入:

3 
1 2 3 
4 5 6 
7 8 9

输出:

215.56

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 23ms, 内存消耗: 608K, 提交时间: 2019-09-24 17:51:25

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+100;
const int MOD=1e9+7;
const double PI=acos(-1);
typedef long long ll;
int n;
double A[60],B[60],K[60];
double F(double x)
{
    double ans=100,res=0;
    for(int i=1;i<=n;i++)
    {
        if(K[i]*(x-A[i])*(x-A[i])+B[i]<ans)
        {
            ans=K[i]*(x-A[i])*(x-A[i])+B[i];
            res=2*K[i]*(x-A[i]);
            if(K[i]*(x-A[i])*(x-A[i])+B[i]>100)res=0;
        }
    }
    return sqrt(1+res*res);
}
double simpson(double a,double b)
{
	double c=a+(b-a)/2;
    return (F(a)+4*F(c)+F(b))*(b-a)/6;   //F(x)是被积分的函数
}
double asr(double a,double b,int dep,double eps,double A)
{
	double c=a+(b-a)/2;
	double L=simpson(a,c);
	double R=simpson(c,b);
	if(dep>=10&&fabs(L+R-A)<=15*eps)return L+R+(L+R-A)/15.0;
	return asr(a,c,dep+1,eps/2,L)+asr(c,b,dep+1,eps/2,R);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%lf%lf%lf",&K[i],&A[i],&B[i]);
    printf("%.2lf\n",asr(0,100,0,1e-8,simpson(0,100)));
    return 0;
}

C++(clang++11) 解法, 执行用时: 10ms, 内存消耗: 396K, 提交时间: 2021-05-08 22:45:39

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef double db;
typedef long long ll;
const db eps=1e-8;
int n,cnt;
db a[110],b[110],k[110]; 
db f(db x){
	db t=100;
	int i,j,id=0;
	for(i=1;i<=n;i++)
	{
		db now=k[i]*(x-a[i])*(x-a[i])+b[i];
		if(now<t) t=now,id=i;
	}
	t= 2*k[id]*(x-a[id]);
	return sqrt(1.0 + t*t);
}
db simpson(db l,db r)
{
	db mid=(l+r)/2.0;
	return (r-l)*(f(l)+4*f(mid)+f(r))/6.0;
}
db asr(db l,db r,db s,db EPS,int dep)
{
	db mid=(l+r)/2.0;
	db left=simpson(l,mid);
	db right=simpson(mid,r);
	if(dep>=10&&abs(left+right-s)<=eps*15) return left+right+(left+right-s)/15;
	return asr(l,mid,left,EPS/2,dep+1)+asr(mid,r,right,EPS/2,dep+1);
}
int main()
{
	cin>>n;
	int i,j;
	for(i=1;i<=n;i++)
		scanf("%lf%lf%lf",&k[i],&a[i],&b[i]);
	db l=0,r=100;
	db ans=asr(l,r,simpson(l,r),eps,1);
	printf("%.2f\n",ans); 
	return 0;
}

上一题