比赛链接:AcWing周赛61 - AcWing
本次迟到了几分钟,所以选择的大可的号来打周赛嘿嘿,怕自己的大小号掉分,这波C特殊情况没有考虑到,但是人均wa1发,我wa了2发。如果写好不wa的话应该能再获得一顶AC帽。
过题数:3/3
排名:29/1950
过题数 | 罚时 | A(1104/1572) | B(706/2120) | C(209/1886) |
---|---|---|---|---|
3 | 0:50:23 | 0:03:44 | 0:07:09 | 0:29:30 (-2) |
A.分糖果(签到)
输出$\left \lfloor \frac{a+b+c}{2} \right \rfloor $即可
我甚至都不想放代码,这都能有人不能AC..
B.指针(状压枚举)
题意:你有一个罗盘(地质三件宝)一开始指针指向$0$,给你$n(1\leq n\leq 15)$个数$a_i$,代表旋转$a_i$度,你可以选择其顺时针旋转还是逆时针旋转,求问最后是否能够重新回到$0$。
思路:状压枚举每一个状态,定义每一位若为1
表示顺时针+
,若为0
表示逆时针-
,对每一个状态的每一位分析即可。
代码:
inline void Case_Test()
{
cin>>n;
for (int i=0;i<n;i++) cin>>a[i];
for (int state = 0; state<(1<<n); state++)
{
int res = 0;
for (int i=0;i<n;i++)
{
if (state&(1<<i))
res += a[i];
else
res -= a[i];
}
res = res % 360;//因为可能有负数,我一开始写的是res=(res+360*100)%360;
//但是仔细一想如果有负数,那么一定有他的相反数(完全相反的状态),所以只需要取模360即可
if (res==0) {cout<<"YES"<<endl;return;}
}
cout<<"NO";
}
C.画圆(计算几何)
题意:给你一个圆(x,y,r)
以及一个点(qx,qy)
,你需要重新画一个圆,这个圆不能包括这个点,但是可以在你画的圆上,求给你的圆剩下的面积最小的时候,你画的圆的圆心坐标以及半径
思路:直接套龙的板子。其实也就是点(qx,qy)
和圆心的直线,会与圆交于两点,然后肯定选择更长的那条线段组成一个更大的圆。
需要注意:1)点重合情况,那么就输出右边的(题目...);2)点在圆外情况,那么输出给你的圆即可,画一个一模一样的。
代码:
代码八百行...
inline void Case_Test()
{
cin>>r>>x>>y>>qx>>qy;
Circle c(Point(x,y),r);
if (c.pointIn(Point(qx,qy)))//点在圆内
{
if (qx==x&&qy==y)//如果重合 特殊判断
{
cout<<fixed<<setprecision(6)<<x+r/2.0<<" "<<y<<" "<<r/2.0<<endl;
return;
}
Line l(Point(qx,qy),Point(x,y));//组成一条直线
vector<Point> vec = lineCircleIntersection(l,c);//求直线与圆的两个交点
Point res;
if (dis(Point(qx,qy),vec[0])>dis(Point(qx,qy),vec[1]))
res=vec[0];
else
res=vec[1];//判断距离与(qx,qy)远的那个点
double ans = dis(Point(qx,qy),res)/2.0;//二者为直径就是答案所需要的圆
cout<<fixed<<setprecision(6)<<(qx+res.x)/2.0<<" "<<(qy+res.y)/2.0<<" "<<ans<<endl;
}
else
cout<<fixed<<setprecision(6)<<x<<" "<<y<<" "<<r<<endl;//点不在圆内,直接就是题目所给的圆,符合题意
}
文章评论