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

n+e

NewWeb:http://trinkle.is-programmer.com/

 
 
 

日志

 
 

[BZOJ4014][FJOI2014]病毒防护带  

2015-01-15 17:29:06|  分类: FJOI |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3. 病毒防护带

(vir.pas/c/cpp)

★问题描述:

众所周知,在国王胖哥的带领下,K国国泰民安,空前繁荣,但今天K国却遇到了空前的危机。

K国境内同时发现了n个未知的病毒,每个病毒会从它被发现的位置开始感染K国的土地,K国可以看做是一个无限大的二维平面,而病毒的感染形状可以看做是一个不断扩大的圆形区域,即在t时间这个病毒会感染半径为t的圆形土地,这个圆形的圆心为发现这个病毒的位置。

但是万幸的是,K国有独特的病毒防护带可以杀死这些病毒,所以K国国王胖哥在刚发现病毒之时就开始着手进行杀毒工作,所谓的病毒防护带可以看成是一条直线,可以选定建立在K国的任意位置,即可以放置在K国所表示的平面上的任意位置,一旦病毒在扩散的过程中接触到这个防护带,病毒就会死亡,它感染的土地面积就固定为这个病毒死亡时所占的土地面积。注意由于防护带的建立十分昂贵,K国最多只能建立一条病毒防护带。

现在胖哥想知道要如何设立这个病毒防护带,才能使每个病毒感染的平均面积最小,即被感染的总土地面积除以病毒数n,每个病毒可以独立看待,即任意一个病毒的死亡不会影响到其他的病毒。注意如果同一个区域被多个病毒感染,那么在计算被感染的土地面积时需要计算多次,即若有一个病毒在位置(0,0)被发现,一个病毒在位置(1,1)被发现,它们都在t=1时接触到防护带死亡,那么此时K国被感染的面积为pi*2,病毒感染的平均面积为pi

由于K国有举世无双的安全监测系统和卫生防护系统,可以认为在病毒防护带建立完毕之后病毒才开始进行扩散。若病毒出现在病毒防护带上,他感染的土地面积可以看做0

★编程任务:

请编程输出在最优决策下,这些病毒感染的平均面积。

★数据输入:

输入文件名为vir.in

文件的第1行中给出正整数Q,表示该组数据中有多少组测试样例。

每组样例首先输入一个整数n (0 < n ≤ 1000000),表示该组样例中病毒的个数,之后一行输入两个正整数xy,表示第一个病毒的坐标,之后一行输入三个正整数abc,如果第i个病毒的坐标为(x, y),那么第i+1个病毒的坐标为(x’, y’),其中x’=(a*x*x + b*x + c)%107y’=(a*y*y + b*y + c)%107,其中%是取模运算符号

输入数据保证:

20%的数据满足n3

50%的数据满足n1000

100%的数据满足Q10n10000000 ≤x, y, a, b, c≤100

★结果输出:

输出文件名为vir.out

首先输出样例编号,之后输出在最优决策下,这些病毒会感染的K国的土地面积,答案保留5位小数,详见输出示例,请严格按照输出实例中的格式输出

输入示例

输出示例

2
2
0 0
0 0 1
3
1 2
3 4 5

Case 1: 0.00000

Case 2: 58.42574

 

题解
[FJOI2014]病毒防护带 - Trinkle - n+e
 
[FJOI2014]病毒防护带 - Trinkle - n+e
 
代码

#include<cstdio>
#include<cmath>
int t,n,x,y,a,b,c,i,ii;double ans,tmp,A,B,C,sx,sx2,sy,sy2,sxy,pi=acos(-1);
double abs(double x){return x>0?x:-x;}
int main()
{
    for(scanf("%d",&t),ii=1;ii<=t;printf("Case %d: %.5lf\n",ii,ans*pi/n),ii++)
    {
        scanf("%d%d%d%d%d%d",&n,&x,&y,&a,&b,&c);
        sx=x,sy=y,sx2=x*x,sy2=y*y,sxy=x*y;
        for(i=2;i<=n;i++)
        {
            x=(a*x*x+b*x+c)%107;
            y=(a*y*y+b*y+c)%107;
            sx+=x,sy+=y,sx2+=x*x,sy2+=y*y,sxy+=x*y;
        }
        if(abs(sx*sy/n-sxy)<=1e-9)ans=0;
        else
        {
            C=(sy2-sx2+(sx*sx-sy*sy)/n)/(sx*sy/n-sxy);
            B=(-C+sqrt(C*C+4))/2;
            A=(sy-B*sx)/n;
            ans=(sy2+n*A*A+B*B*sx2-2*A*sy-2*B*sxy+2*A*B*sx)/(1+B*B);
            B=(-C-sqrt(C*C+4))/2;
            A=(sy-B*sx)/n;
            tmp=(sy2+n*A*A+B*B*sx2-2*A*sy-2*B*sxy+2*A*B*sx)/(1+B*B);
            if(ans>tmp)ans=tmp;
        }
    }
}

  评论这张
 
阅读(323)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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