周赛130715World Finals 2012 - Warsaw

今天组队赛做了final题,最后一题也没出,真是有些感慨呀,差距还是很大的。

有一下几个方面:

1.英文题不太好读懂。得多练习。

2.算法很多都忘记了。得每隔一段时间复习下。

这里赛后做了B题:

原来想不求原函数,直接划分小单元求积分的,不过这种方法精度不好控制,因为精度和复杂度有关。

后来用求原函数的方法来写,还是Wa了几发,原来是太注意题目中的0.01和0.05,最后没考虑这两点就过了。唉,有些时候都不知道到底啥得考虑,啥得不考虑了。

代码:

#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#define pi 3.141592653
#define exp 1e-8
#define maxn 20
#define INF 0xfffffff
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
using namespace std;
int n,cnt;
double xl,xr,v;
double a[maxn],num[maxn];
double f(double L,double R)
{
    double ret=0;
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            ret=ret+(a[i]*a[j])*(pow(R,i+j+1)-pow(L,i+j+1))/(1.0*(i+j+1));
        }
    }
    return ret;
}
int main()
{
    int c=1;
    while(scanf("%d",&n)!=EOF)
    {
        //memset(a,0,sizeof(a));
        for(int i=0;i<=n;i++)
        {
            scanf("%lf",&a[i]);
        }
        scanf("%lf %lf %lf",&xl,&xr,&v);
        double re=pi*f(xl,xr);
        printf("Case %d: %.2f\n",c++,re);
        cnt=1;
        double mv=v;
        for(int i=0;i<8;i++)
        {
            mv=v*cnt;
            //cout<<mv<<endl;
            if(mv>re)
            break;
            double l=xl,r=xr,mid;
            while(r-l>exp)
            {
                mid=(l+r)/2.0;
                if(pi*f(xl,mid)<mv)
                {
                    l=mid;
                }
                else
                {
                    r=mid;
                }
            }
            //if(xr-l<0.01||l-num[cnt-1]<0.05)
            //break;
            num[cnt++]=l;
        }
        if(cnt==1)
        {
            printf("insufficient volume\n");
            continue;
        }
        for(int i=1;i<cnt;i++)
        {
            printf("%.2f",num[i]-xl);
            if(i<cnt-1)
            printf(" ");
            else
            printf("\n");
        }
    }
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值