注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ydc的博客

 
 
 

日志

 
 

bzoj1011  

2013-01-23 13:00:37|  分类: bzoj |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

遥远的行星:

这是这次考试最难的……

说不定也是最容易的几道之一(因为实在不能说他比越狱容易所以就只能说几道之一了)

刚开始完全无思路……

就是因为不清楚如何应用那个答案误差不超过5%啦。

从没见过这么诡异的题一下就懵了,问到了方法之后都还半信半疑,直到后来发现真的很有效果。

就是小于2000的,我们n^2爆搞一下,大于两千的,由于α很小,i又大于2000,所以i-i×α挺大的,准确的说1/(i-1)与1/(i-i×α)差不多大……

那么对于大于2000的i,假如他能弄到k,我们只要把公式中的i-j都变成i-2/k就可以了,误差不会很大。

另外就是不能直接写(int)(a*i),因为当α=0.350000,i=20时给我算出来了个6……所以判一下

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 100010
#define eps 1e-7
using namespace std;
typedef long long LL;
int n;
LL m[MAXN],sum[MAXN];
double a,F[MAXN];
void read()
{
    scanf("%d %lf",&n,&a);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&m[i]);
        sum[i]=sum[i-1]+m[i];
    }
}
void solve()
{
    for(int i=min(n,2000);i>=1;i--)
    {
        int k=(int)(a*i);
        if(fabs((double)(k+1)/a-i)<eps)  k++;
        for(int j=1;j<=k;j++)
            F[i]=F[i]+m[i]*m[j]/(double)(i-j);
    }
    for(int i=2001;i<=n;i++)
    {
        int k=(int)(a*i),mid=(1+k)>>1;
        F[i]=sum[k]*m[i]/(double)(i-mid);
    }
}
void print()
{
    for(int i=1;i<=n;i++)
        printf("%lf\n",F[i]);
}
int main()
{
    read();
    solve();
    print();
    return 0;
}
  评论这张
 
阅读(720)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017