else
{
for(i=0;i<43200;i++)
{
A:
as=i%60*vs;
am=i%3600*vm;
ah=i*vh;
if(ah360-D+ah||am<=ah))
{
temp1=min(fabs(am-ah),360-fabs(am-ah));
i+=int((D+temp1)*120/11);//0.1x-1*x/120-temp1=D
gotoA;
}
elseif(ah>=D&&am>ah-D&&am<=ah)
{
i+=int((D+ah-am)*120/11);
gotoA;
}
if(am360-D+am||as<=am))
{
temp2=min(fabs(as-am),360-fabs(as-am));
i+=int((D+temp2)/5.9);//6x-0.1*x-temp2=D
gotoA;
}
elseif(am>=D&&as>am-D&&as<=am)
{
i+=int((D+am-as)/5.9);
gotoA;
}
if(fabs(as-am)>=D&&360-fabs(as-am)>=D&&fabs(as-ah)>=D&&360-fabs(as-ah)>=D&&fabs(am-ah)>=D&&360-fabs(am-ah)>=D)
count++;
}
cout<}
}
}
//改进了精度,但是会超时
#include
usingnamespacestd;
#include
doublemin(doublex,doubley){returnxx:
y;}
#include
intmain()
{
inti,count=0;
doubleD,vh=1/7200.0,vm=1/600.0,vs=0.1;
doubleah,am,as,temp1,temp2;
cout<:
fixed)<while(cin>>D&&D!
=-1)
{
count=0;
if(D==0){cout<<100.000<elseif(D==120){cout<<0.000<else
{
for(i=0;i<2592000;i++)
{
A:
as=i%3600*vs;
am=i%216000*vm;
ah=i*vh;
if(ah360-D+ah||am<=ah))
{
temp1=min(fabs(am-ah),360-fabs(am-ah));
i+=int((D+temp1)*7200/11);//0.1x-1*x/120-temp1=D
gotoA;
}
elseif(ah>=D&&am>ah-D&&am<=ah)
{
i+=int((D+ah-am)*7200/11);
gotoA;
}
if(am360-D+am||as<=am))
{
temp2=min(fabs(as-am),360-fabs(as-am));
i+=int((D+temp2)/10.1695);//6x-0.1*x-temp2=D
gotoA;
}
elseif(am>=D&&as>am-D&&as<=am)
{
i+=int((D+am-as)/10.1695);
gotoA;
}
if(fabs(as-am)>=D&&360-fabs(as-am)>=D&&fabs(as-ah)>=D&&360-fabs(as-ah)>=D&&fabs(am-ah)>=D&&360-fabs(am-ah)>=D)
count++;
}
cout<}
}
}
//一个神奇的代码,此代码结果与AC结果误差在0.002以内
#include
usingnamespacestd;
#include
intmain(){
doubleD;
doublepercentage;
cout<:
fixed)<while(cin>>D&&D!
=-1)
{
percentage=100*(1-D/120.0)*(1-D/120.0);
cout<}
}
//大牛的解法,相对角速度与相对周期来做
#include
#include
usingnamespacestd;
//constdoublew_h=1.0/120,w_m=1./10,w_s=6.0;//角速度
constdoublehm=11.0/120,hs=719.0/120,sm=59.0/10;//相对角速度
constdoubleT_hm=43200.0/11,T_hs=43200.0/719,T_sm=3600.0/59;//相对周期
inlinedoublemin(doublea,doubleb,doublec)//内敛函数
{
doubletemp=(a>b)?
b:
a;
return(c>temp)?
temp:
c;
}
inlinedoublemax(doublea,doubleb,doublec)
{
doubletemp=(a>b)?
a:
b;
return(c>temp)?
c:
temp;
}
intmain()
{
doubleD;
doublex[3],y[3];
doublem[3],n[3];
doubleend,begin,sum;
while(cin>>D&&D!
=-1)
{
x[0]=D/hm;
x[1]=D/hs;
x[2]=D/sm;
y[0]=(360-D)/hm;
y[1]=(360-D)/hs;
y[2]=(360-D)/sm;
sum=0.0;
cout<:
fixed);
for(m[0]=x[0],n[0]=y[0];n[0]<43200.000001;m[0]+=T_hm,n[0]+=T_hm)
{
for(m[1]=x[1],n[1]=y[1];n[1]<43200.000001;m[1]+=T_hs,n[1]+=T_hs)
{
if(n[0]break;
if(n[1]continue;
for(m[2]=x[2],n[2]=y[2];n[2]<43200.000001;m[2]+=T_sm,n[2]+=T_sm)
{
if(n[1]break;
if(n[2]continue;
begin=max(m[0],m[1],m[2]);
end=min(n[0],n[1],n[2]);
if(beginsum+=(end-begin);
}
}
}
cout<}
}
1007
//二分法,会超时
#include
#include
#include
#defineMAXN100005
usingnamespacestd;
structPoint{
doublex,y;
}point[MAXN],*px[MAXN],*py[MAXN];
doubleget_dis(Point*p1,Point*p2)
{returnsqrt((p1->x-p2->x)*(p1->x-p2->x)+(p1->y-p2->y)*(p1->y-p2->y));}
boolcmpx(Point*p1,Point*p2)
{returnp1->xx;}
boolcmpy(Point*p1,Point*p2)
{returnp1->yy;}
doublemin(doublea,doubleb)
{returna
a:
b;}
//#definemin(a,b)(a
a:
b)效率比上面的函数低!
//-------核心代码------------//
doubleclosest(ints,inte)
{
if(s+1==e)
returnget_dis(px[s],px[e]);
if(s+2==e)
returnmin(get_dis(px[s],px[s+1]),min(get_dis(px[s+1],px[e]),get_dis(px[s],px[e])));
intmid=(s+e)>>1;
doubleans=min(closest(s,mid),closest(mid+1,e));//递归求解
inti,j,cnt=0;
for(i=s;i<=e;i++)//把x坐标在px[mid].x-ans~px[mid].x+ans范围内的点取出来
{
if(px[i]->x>=px[mid]->x-ans&&px[i]->x<=px[mid]->x+ans)
py[cnt++]=px[i];
}
sort(py,py+cnt,cmpy);//按y坐标排序
for(i=0;i{
for(j=i+1;jy-py[i]->y{ans=min(ans,get_dis(py[i],py[j]));}
}
returnans;
}
intmain()
{
inti,n;
while(cin>>n&&n){
for(i=0;i{
scanf("%lf%lf",&point[i].x,&point[i].y);
px[i]=&point[i];
}
sort(px,px+n,cmpx);
doubledistance=closest(0,n-1)/2;
printf("%.2lf\n",distance);
}
return0;
}
//枚举相邻三个点,方法不当,当水过
#include
#include
#include
#defineMAXN100005
usingnamespacestd;
structPoint{
doublex,y;
}point[MAXN],*px[MAXN],*py[MAXN];
doubleget_dis(Point*p1,Point*p2)
{returnsqrt((p1->x-p2->x)*(p1->x-p2->x)+(p1->y-p2->y)*(p1->y-p2->y));}
boolcmpx(Point*p1,Point*p2)
{returnp1->xx;}
boolcmpy(Point*p1,Point*p2)
{returnp1->yy;}
doublemin(doublea,doubleb)
{returna
a:
b;}
doublemin(doublea,doubleb,doublec)
{
returna
(aa:
c):
(bb:
c);
}
//#definemin(a,b)(a
a:
b)效率比上面的函数低!
//-------核心代码------------//
doubleclosest(ints,inte)
{
if(s+1==e)
returnget_dis(px[s],px[e]);
if(s+2==e)
returnmin(get_dis(px[s],px[s+1]),get_dis(px[s+1],px[e]),get_dis(px[s],px[e]));
intmid=(s+e)>>1;
doubleans=min(closest(s,mid),closest(mid+1,e));//递归求解
inti,j,cnt=0;
for(i=s;i<=e;i++)//把x坐标在px[mid].x-ans~px[mid].x+ans范围内的点取出来
{
if(px[i]->x>=px[mid]->x-ans&&px[i]->x<=px[mid]->x+ans)
py[cnt++]=px[i];
}
if(cnt==2)
{ans=min(ans,get_dis(py[j],py[1]));}
for(j=0;j{//枚举相邻三个点,求最短距离,其实不对,题目数据很水!
ans=min(ans,get_dis(py[j],py[j+1]),get_dis(py[j],py[j+2]));
}
returnans;
}
intmain()
{
inti,n;
while(cin>>n&&n){
for(i=0;i{
scanf("%lf%lf",&point[i].x,&point[i].y);
px[i]=&point[i];
}
sort(px,px+n,cmpx);
doubledistance=closest(0,n-1)/2;
printf("%.2lf\n",distance);
}
return0;
}
//不用递归做
#include
#include
#include
#defineMAXN100005
usingnamespacestd;
structPoint{
doublex,y;
}point[MAXN];
doubleget_dis(Point*p1,Point*p2)
{returnsqrt((p1->x-p2->x)*(p1->x-p2->x)+(p1->y-p2->y)*(p1->y-p2->y));}
boolcmp(Pointp1,Pointp2)
{
if(p1.x!
=p2.x)
returnp1.xelse
returnp1.y}
doublemin(doublea,doubleb)
{returna
a:
b;}
doubleclosest(intn)
{
inti,j,step=3;
doubleMIN=get_dis(&point[0],&point[1]);
for(i=0;i