UVA 12905 Volume of Revolution

题意:分段用椎台面积近似计算体积,然后计算出近似值和真实值的相对误差

微积分加数学。

平头椎台的体积计算公式:

V = 1/3*h*(S1+S2*sqrt(S1*S2)

一个更快的计算多项式值的方法,来自豪爷,算法是for(int i = 15; i >= 0; i--) ans += ans*x+p[i],比我写的这个快了一倍

#include<cstdio>
#include<cmath>
#include<cstring>
const double pi = atan(1)*4;

int poly[8],Q[16],n;

inline double calR(double x)
{
    double ans = poly[0];
    for(int i = 1; i <= n; i++ ){
        ans += poly[i]*pow(x,i);
    }
    return ans;
}

inline double calint(int x){
    double ans = 0;
    for(int i = 0,sz = n<<1; i <= sz; i++ ){
        ans += Q[i]*pow(x,i+1)/(i+1);
    }
    return ans;
}

inline double calV(int a,int b){
    memset(Q,0,sizeof(Q));
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= n; j++)
            Q[i+j] += poly[i]*poly[j];
    }

    return (calint(b)-calint(a))*pi;
}

inline double calS(double R,double theta,int slices){
    return R*sin(theta)/2*R*slices;
}

int main()
{

    int T;
    scanf("%d",&T);
    int cas = 0;
    while(T--){
        memset(poly,0,sizeof(poly));
        scanf("%d",&n);
        for(int i = n; i >= 0;i--)
            scanf("%d",poly+i);
        int a,b;
        scanf("%d%d",&a,&b);
        int slices,stacks;
        scanf("%d%d",&slices,&stacks);
        double dx = (b-a)*1.0/stacks, dtheta = 2*pi/slices;
        double R1 = calR(a),S1 = calS(R1,dtheta,slices);

        double x = a+dx;

        double ape = 0;
        for(int i = 0; i < stacks; i++){
            double R2 = calR(x);
            double S2 = calS(R2,dtheta,slices);
            double dS = dx/3*(S1+S2+sqrt(S1*S2));
            ape += dS;
            x += dx;
            R1 = R2; S1 =S2;
        }
        double vol = calV(a,b);

        printf("Case %d: %.4lf\n",++cas,fabs(ape-vol)/vol*100);
    }
    return 0;
}
时间: 2024-10-19 17:33:09

UVA 12905 Volume of Revolution的相关文章

UVA 1487 - Volume(积分)

UVA 1487 - Volume 题目链接 题意:给定r,h,求图中该图形体积 思路:积分题,用总面积减去重合体积,一个卦限重合体积为∫∫Dr2?h2??????√,求得r2x?13x3,然后这个面积乘8就是总重合体积,但是注意题目中可能存在2r>h,对于这种情况实际上中间重合部分等于多一个立方体,求出该立方体高就能求出体积了,画图很容易看出高为r2?h22,算出重合体积再用总体积减去即可 代码: #include <cstdio> #include <cstring> #

递推DP UVA 1291 Dance Dance Revolution

题目传送门 1 /* 2 题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少 3 DP:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程:(a[i], k) <- min (a[i-1], k) + cost 4 以及(a[i-1], a[i]) <- min (a[i-1], k) + cost, (k, a[i])和(a[i], a[i-1])情况类似,最后再去最小值就行了 5 */ 6 /*********

uva 1291 dp

UVA 1291 - Dance Dance Revolution 有一个跳舞机.原点为0,有四个方向,上左下右,分别标成(1234),初始玩家两只脚站在 0 位置,跳舞机会给出一串数字,玩家要按照顺序踩下四个方向的数字.移动脚会消耗玩家的能量,从0位置移动到四个方向消耗2点能量,从一个方向移动到另一个相邻的方向消耗3点能量,从一个方向移动到相反方向消耗4点能量,原点踩一下消耗1点能量.问你踩出这串数子最少要花多少能量. 根据能量消耗关系,我们可以发现当前两只脚踩的方向才是重点.然而要记录两只脚

dp题目列表

10271 - Chopsticks 10739 - String to Palindrome 10453 - Make Palindrome 10401 - Injured Queen Problem 825 - Walking on the Safe Side 10617 - Again Palindrome 10201 - Adventures in Moving - Part IV 11258 - String Partition 10564 - Paths through the Ho

UVA 10693 10693 - Traffic Volume(数论)

题目链接:10693 - Traffic Volume 根据物理知识, 车经过的时间等于,距离/速度,所以可以列出公式t = (l + d)/v,v/2f + d/v,只有当v / 2f = d/v时,时间最小,v = sqrt(2df),之后时间也能算了. #include <stdio.h> #include <string.h> #include <math.h> double l, f; int main() { while (~scanf("%lf%

UVA 1291 十四 Dance Dance Revolution

Dance Dance Revolution Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 1291 Mr. White, a fat man, now is crazy about a game named ``Dance, Dance, Revolution". But his dance skill is so poor that h

UVa 1291- Dance Dance Revolution(DP)

Dance Dance Revolution Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu SubmitStatus Description Mr. White, a fat man, now is crazy about a game named ``Dance, Dance, Revolution". But his dance skill is so poor that he could not dan

UVA 1291-Dance Dance Revolution(DP)

题目大意:有4个位置,每次从一个位置移动到另一个位置需要特定花费,求一串指定序列的最短花费.每次只能一只脚移动,或移动并踩下. 用d[i][j][u]表示前i个位置完成且在(j,u)的状态最小花费是多少,(j,u)其中之一必须和a[i]相等,假设是j和a[i]相等,那么可能上一个状态也是(j,u),或者上一个状态是(k,u),注意上一个状态不能是(j,k),因为这样需要左脚踩踏,右脚移动,不合法.至于移动的到底是左脚还是右脚,不用关心,因为总是可以进行转移. 状态转移方程: d[i][j][u]

UVa 10693 - Traffic Volume

題目:車速為v,車之間的距離最少為v^2/(2f)(防止裝車),車長為L,問1小時最多能走過幾輛車. 分析:數學.物理. ? ? ? ? ? ? 根據題意能够列出方程:nL + (n-1)d = nL + (n-1)v^2/(2f) = 3600v,計算n.化簡得: ? ? ? ? ? ? n = 7200f/(2Lf/v + v).這是一個對號函數.當2Lf = v^2 是有最大值. ? ? ? ? ? ? 因此v = sqrt(2Lf),n = 1800sqrt(2f/L). 說明:╮(╯▽