1
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
const double pi=acos(-1.0);
double ans1,ans2,X,tmp;
int cases,n,i,j,th,x,y;
int point[11000][2];
double angle[31000];
int main()
{
cases=0;
while(1)
{
scanf("%d %d",&n,&th);
if(n==0 && th==0)
break;
point[0][0]=point[0][1]=0;
for(i=1;i<=n;i++)
scanf("%d %d",&point[i][0],&point[i][1]);
if(th==0)
{
printf("Case %d: Acceptable as proposed\n\n",++cases);
continue;
}
for(i=0;i<n;i++)
{
x=point[i+1][0]-point[i][0];
y=point[i+1][1]-point[i][1];
if(x>0)
angle[i]=acos(double(y/sqrt(double(x*x+y*y))));
if(x<0)
angle[i]=2*pi-acos(double(y/sqrt(double(x*x+y*y))));
if(x==0&&y>0)
angle[i]=0;
if(x==0&&y<0)
angle[i]=pi;
}
sort(angle,angle+n);
if(angle[n-1]<=pi)
{
printf("Case %d: Acceptable as proposed\n\n",++cases);
continue;
}
ans1=ans2=-1;
for(i=0;i<n;i++)
{
X=pi*2-angle[i];
tmp=angle[(i+n-1)%n]+X;
if(0<=tmp&&tmp<=pi)
{
if(ans1<0||X<ans1)
ans1=X;
}
X=angle[i]-pi;
if(X<0)
X+=pi*2;
tmp=angle[(i+1)%n]-X;
if(0<=tmp&&tmp<=pi)
{
if(ans2<0||X<ans2)
ans2=X;
}
}
printf("Case %d: ",++cases);
if(ans1<0&&ans2<0)
printf("Unacceptable\n\n");
else
if(ans1>=0&&(ans2<0||ans1<ans2+1e-6))
printf("Acceptable after clockwise rotation of %.2lf degrees\n\n",ans1/pi*180);
else
printf("Acceptable after counterclockwise rotation of %.2lf degrees\n\n",ans2/pi*180);
}
return 0;
}
2
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
int n,m,i,t,d,l,r,B,x[1009],y[1009],mark[1009];
long long S,u,v;
unsigned long long g;
void gcd(int &d,int x)
{
int z;
d=labs(d);
x=labs(x);
while(x%d)
{
z=x%d;
x=d;
d=z;
}
}
int main()
{
while(scanf("%d%d",&n,&m)&&n)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]);
mark[i]=1;
}
for(i=0;i<n;i++)
{
l=(i+n-1)%n;
r=(i+1)%n;
u=x[l]-x[i];
u*=y[r]-y[i];
v=y[l]-y[i];
v*=x[r]-x[i];
if(u==v)
mark[i]=0;
}
l=0;
for(i=0;i<n;i++)
if(mark[i])
{
x[l]=x[i];
y[l++]=y[i];
}
n=l;
for(i=1;i<n;i++)
{
x[i]-=x[0];
y[i]-=y[0];
}
x[0]=0;
y[0]=0;
x[n]=0;
y[n]=0;
for(i=1;i<n;i++)
{
if(x[i])
d=x[i];
if(y[i])
d=y[i];
}
for(i=1;i<n;i++)
{
gcd(d,x[i]);
gcd(d,y[i]);
}
B=0;
for(i=1;i<=n;i++)
{
x[i]/=d;
y[i]/=d;
r=x[i]-x[i-1];
if(r!=0)
gcd(r,y[i]-y[i-1]);
else
r=labs(y[i]-y[i-1]);
B+=r;
}
S=0;
for(i=0;i<n;i++)
{
u=x[i];
u*=y[i+1];
v=x[i+1];
v*=y[i];
S+=u-v;
}
if(S<0)
S=-S;
u=m;
u*=m+1;
u/=2;
u*=m+m+1;
u/=3;
g=u;
g*=S;
v=m;
v*=m+1;
v/=2;
v*=B;
g=g-v+m+m;
printf("Case %d: %llu\n",++t,g/2);
}
return 0;
}
3
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int n,i,j,x[101],y[101],mark[102],px,py,vl,vp,cases,ans;
double C,d,l,r,m,t,map[102][102],len[102];
double dis(double dx,double dy)
{
return sqrt(dx*dx+dy*dy);
}
int cross(double xa,double ya,double xb,double yb,double xc,double yc,double xd,double yd)
{
if(xa<xc&&xb<xc&&xa<xd&&xb<xd)
return 0;
if(ya<yc&&yb<yc&&ya<yd&&yc<yd)
return 0;
if(xa>xc&&xb>xc&&xa>xd&&xb>xd)
return 0;
if(ya>yc&&yb>yc&&ya>yd&&yb>yd)
return 0;
double cra,crb;
cra=(xb-xa)*(yc-ya)-(yb-ya)*(xc-xa);
crb=(xb-xa)*(yd-ya)-(yb-ya)*(xd-xa);
if(cra*crb>0)
return 0;
cra=(xd-xc)*(ya-yc)-(yd-yc)*(xa-xc);
crb=(xd-xc)*(yb-yc)-(yd-yc)*(xb-xc);
if(cra*crb>0)
return 0;
return 1;
}
int in_shape(double ox,double oy)
{
int i,c;
c=0;
for(i=0;i<n;i++)
c+=cross(ox,oy,98765,43210,x[i],y[i],x[i+1],y[i+1]);
return c&1;
}
int no_cross(double xa,double ya,double xb,double yb)
{
int i;
if(in_shape((xa+xb)/2,(ya+yb)/2))
return 0;
xa=xa*(1-1e-7)+xb*1e-7;
ya=ya*(1-1e-7)+yb*1e-7;
xb=xb*(1-1e-7)+xa*1e-7;
yb=yb*(1-1e-7)+ya*1e-7;
for(i=0;i<n;i++)
if(cross(xa,ya,xb,yb,x[i],y[i],x[i+1],y[i+1]))
return 0;
return 1;
}
double best_path()
{
double s,lx,ly,bl,tl;
int i,j,bj;
s=m*vl;
s-=int(s/C)*C;
for(i=0;i<n;i++)
{
if(s<map[i][(i+1)%n])
break;
s-=map[i][(i+1)%n];
}
d=map[i][(i+1)%n];
lx=x[i]*(d-s)/d + x[(i+1)%n]*s/d;
ly=y[i]*(d-s)/d + y[(i+1)%n]*s/d;
if(no_cross(px,py,lx,ly))
return dis(px-lx,py-ly);
j=i;
for(i=0;i<n;i++)
{
if(i==j||i==(j+1)%n||no_cross(lx,ly,x[i],y[i]))
{
map[n][i]=dis(lx-x[i],ly-y[i]);
map[i][n]=map[n][i];
}
else
{
map[n][i]=-2;
map[i][n]=-2;
}
if(no_cross(px,py,x[i],y[i]))
{
map[n+1][i]=dis(px-x[i],py-y[i]);
map[i][n+1]=map[n+1][i];
}
else
{
map[n+1][i]=-2;
map[i][n+1]=-2;
}
len[i]=1e9;
}
len[n]=1e9;
len[n+1]=0;
memset(mark,0,sizeof(mark));
for(i=0;i<=n;i++)
{
bl=1e9;
for(j=0;j<n+2;j++)
if(!mark[j]&&len[j]<bl)
{
bl=len[j];
bj=j;
}
mark[bj]=1;
for(j=0;j<=n;j++)
if(!mark[j]&&map[bj][j]>-1)
{
tl=bl+map[bj][j];
if(tl<len[j])
len[j]=tl;
}
}
return len[n];
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(i=0;i<n+2;i++)
for(j=0;j<n+2;j++)
map[i][j]=-2;
for(i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
x[n]=x[0];
y[n]=y[0];
C=0;
for(i=0;i<n;i++)
{
d=dis(x[i]-x[i+1],y[i]-y[i+1]);
C+=d;
map[i][(i+1)%n]=d;
map[(i+1)%n][i]=d;
}
for(i=0;i<n-2;i++)
for(j=i+2;j<n;j++)
if(no_cross(x[i],y[i],x[j],y[j]))
{
map[i][j]=dis(x[i]-x[j],y[i]-y[j]);
map[j][i]=map[i][j];
}
scanf("%d%d%d%d",&px,&py,&vl,&vp);
l=0;
r=1e8;
while(r-l>1e-8)
{
m=(l+r)/2;
t=best_path()/vp;
if(t<m)
r=m;
else
l=m;
}
ans=int(m*60+0.5);
printf("Case %d: Time = %d:%02d\n",++cases,ans/60,ans%60);
}
return 0;
}