感觉像是个人赛,不过要是个人赛的话他们真的是太牛了。。。完全被虐爆了有没有啊。
总体来说题目不是很难,下面就粘一下代码吧。
队友看的A,看完就发现了水题本质,但是敲的不是很顺利。。。是因为太久没做比赛么。。
#include
#include
#include
#include
#include
#include
#include
#include
#include
B题看完就发现了,公式题一个,,,但是,读错题了。。。经队友矫正,又读错了。。。=.=!!(什么情况,要gg了,过了很久终于懂了题目让干什么,推了下公式就A了,题目给的是当前天和过后一天细菌的情况,然后问n天后的情况。
#include
#include
#include
#include
#include
#include
#include
#include
#include
D题好像就是求一下向量夹角就行了。。
#include
#include
#include
#include
using namespace std;
const double pi=3.14159265358;
const double eps=1e-8;
int dblcmp(double x)
{
if(x<-eps) return -1;
if(x>eps) return 1;
return 0;
}
struct point
{
double x,y,k;
point(double a=0,double b=0,double c=0)
{
x=a,y=b,k=c;
}
point operator-(const point &a)
{
return point(x-a.x,y-a.y,k);
}
void input()
{
scanf("%lf%lf%lf",&x,&y,&k);
}
bool friend operator<(const point &a,const point &b)
{
return a.k180.00) ans=360.00-ans;
printf("%.3f\n",ans);
}
}
H竟然11分钟就有人A掉了,太厉害了。。。推了下,既然是汉诺塔,就肯定是有递推关系了。t[a+1] = 1/3*t[a]+2/3*(t[a] + 1 + f[a]);f[a]表示a个盘子的正常汉诺塔问题,即本来是在一个位置A,转移到C的步数。
#include
#include
#include
#include
#include
#include
#include
#include
#include
C题每次都询问右上角,显然询问值大于当前值的话,就可以删掉最右边一列,如果小于当前值的话就删掉最上边一行,就这样。。。输出很特别啊
#include
#include
#include
#include
#include
#include
#include
#include
#include
J题正常搞肯定超时,这种题,不是式子满足交换结合律之类,就是乘法特别,队友推出时满足这样
(A
B)((A
T
).+1
(B
T
).+1) = (A*((AT).+1))(B*((BT).+1)),这样就妥妥的能AC了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
F题dp一枚,每次枚举出每组的情况,然后结合前面能组成的情况,dp就可以了。dp[i]表示sum个位置哪个位置被占用了。时间复杂度不明。。。
#include
#include
#include
#include
#include
#include
#include
#include
#include
G题有类似的题目,错到最后,发现模板有问题。。。汗!赛后两分钟换了个模板就A了。。。闹哪样啊这是。(代码风格可以看出。。。显然不是我做的,完全不知道怎么做啊=,=!!)
#include
#include
#include
#include
double Dis(double x1, double y1, double x2, double y2)
{
double dx=x1-x2;
double dy=y1-y2;
return sqrt(dx*dx+dy*dy);
}
void Get_KL(double L, double x, double y, int &k, int &l, double &cd)
{
k=floor((2.0*x)/(3.0*L));
l=floor((2.0*y)/(sqrt(3.0)*L));
double d1, d2, x1, y1, x2, y2;
if ((k+l)&1)
{
x1=k*L*1.5;
y1=(l+1.0)*L*sqrt(3.0)*0.5;
x2=(k+1.0)*L*1.5;
y2=l*L*sqrt(3.0)*0.5;
d1=Dis(x1,y1, x,y);
d2=Dis(x2,y2, x,y);
if (d1>d2)
{
k++;
cd=d2;
}
else
{
l++;
cd=d1;
}
}
else
{
x1=k*L*1.5;
y1=l*L*sqrt(3.0)*0.5;
x2=(k+1.0)*L*1.5;
y2=(l+1.0)*L*sqrt(3.0)*0.5;
d1=Dis(x1,y1, x,y);
d2=Dis(x2,y2, x,y);
if (d1>d2)
{
k++,l++;
cd=d2;
}
else cd=d1;
}
}
int My_Abs(int x)
{
if (x<0) return -x;
return x;
}
int main (void)
{
double L, x1, y1, x2, y2, cd1, cd2;
int k1, l1, k2, l2, ans;
int t;
scanf("%d",&t);
while (t--)
{
scanf("%lf %lf %lf %lf %lf",&L,&y1,&x1,&y2,&x2);
y1=-y1,y2=-y2;
Get_KL(L, x1, y1, k1, l1, cd1);
Get_KL(L, x2, y2, k2, l2, cd2);
if (k1==k2&&l1==l2) printf("%d\n",0);
else
{
ans=0;
if (My_Abs(k1-k2) > My_Abs(l1-l2))
ans=My_Abs(k1-k2);
else ans=My_Abs(k1-k2)+(My_Abs(l1-l2)-My_Abs(k1-k2))/2;
printf("%d\n", ans);
}
}
return 0;
}