CarryNotKarry

  • 首页
  • 语言学习
    • C++程序设计
    • 汇编语言
    • Python
  • 比赛总结
  • ACM-ICPC
    • 动态规划
    • 字符串
    • 搜索
    • 数学
    • 数据结构
    • 图论
    • 计算几何
    • 杂项
  • 分享
  • 上课内容
  • 其他
Carry
CUGBACMer/皇马球迷/C罗人迷
  1. 首页
  2. 比赛总结
  3. 正文

AcWing周赛61

2022年7月24日 385点热度 0人点赞 0条评论

比赛链接: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;//点不在圆内,直接就是题目所给的圆,符合题意
}
标签: AcWing周赛 计算几何
最后更新:2022年7月24日

Carry

来自于湖南长沙

点赞
< 上一篇
下一篇 >

文章评论

取消回复
标签
AcWing周赛 计算几何
文章目录
  • A.分糖果(签到)
  • B.指针(状压枚举)
  • C.画圆(计算几何)
其他文章

Carry爱三进制题解

【区间DP】POJ2955.Brackets

Codeforces Educational Round 122(Rated for Div.2)比赛总结 (rating+77)

汇编语言 实验四 子程序结构

汇编语言 实验三 循环结构和分支结构程序设计

C++程序设计

【基环树+思维】AcWing 1738.蹄球——每日一题2.6

AtCoder Beginner Contest 238比赛总结

【算法学习】线性基

【线性基】[BJWC2011]元素题解

From Carry
  • 在下不才,本博客也是为了记录自己的成长,并非成为非常专业的博客。
  • 如果有能够帮助你的地方是我最大的荣幸,一起加油吧!

ECNU-My love

THEME KRATOS MADE BY VTROIS