【牛客小白月赛22】NC202505 工具人

工具人

https://ac.nowcoder.com/acm/contest/4462/I

本场比赛通过人数只有十几人的数学毒瘤题qwq。。关于此题讲解好像也不多,要先了解基本的弧度知识,初中蒟蒻瑟瑟发抖

在@Marco.L.T. dalao的帮助下,小蒟蒻勉强通过了本题(下面的代码是在Marco.L.T.代码的基础上稍微改进的)

先把代码放这qwq,等小蒟蒻完全弄懂了,会来不断完善本篇题解的!

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
struct node {
    double x,y,l,r;
} p[505];
inline bool cmp(node a,node b) {
    return a.l<b.l;
}
const double pi=acos(-1);//acos()是反余弦函数,cosπ = -1,所以π = acos(-1)。
double pl[505],pr[505],maxr[505],r;
int main() {
    int n,T,cnt,cnt2,ans,pos,tot;
    double d,dis,si,otg,t,tg;

    scanf("%d",&T);
    while(T--) {
        scanf("%d%lf",&n,&d),cnt=0;
        for (int x,y,i=1; i<=n; i++) {
            scanf("%d%d",&x,&y);
            dis=sqrt(x*x+y*y);//计算到原点距离
            if (dis<=d) continue;//由于射线都是以原点为端点,所以dis<=d则任一条射线都可覆盖到,略过此点

            si=d/dis,otg=si/sqrt(1-si*si);//计算可行的夹角区间(在这个区间内的射线到点(x,y)的距离都小于d,即可以覆盖到),otg是两条切线夹角的1/2(见下图))
            t=atan(otg),tg=atan2(y,x);//atan可返回数字的反正切值

            while(tg-t<0) tg+=2*pi;
            while(tg-t>2*pi) tg-=2*pi;//加减2pi就是保证所有角度在一圈以内(因为x+2pi和x表示的角度相同)
            p[++cnt]=(node) {
                x,y,tg-t,tg+t
            };
        }

        sort(p+1,p+cnt+1,cmp);

        if (cnt) {
            ans=cnt;//最多要cnt条射线
            for(int i=1; i<=cnt; i++) {
                cnt2=0;

                for (int j=i; j<=cnt; j++)
                    pl[++cnt2]=p[j].l,pr[cnt2]=p[j].r;
                for (int j=1; j<i; j++)
                    pl[++cnt2]=p[j].l+2*pi,pr[cnt2]=p[j].r+2*pi;

                pos=1,tot=0,maxr[cnt]=pr[cnt];
                for (int j=cnt-1; j; j--) maxr[j]=min(maxr[j+1],pr[j]);
                while(pos<=cnt) {

                    r=maxr[pos];
                    while(pos<=cnt && pl[pos]<=r) pos++;
                    tot++;
                }
                ans=min(ans,tot);
            }
            printf("%d\n",ans);
        } else puts("1"); //由于病毒数n>=0,如果病毒到圆心距离<=d,至少需要一条直线
    }
}

全部评论

相关推荐

10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
从小父母离异家里没人管,靠着心里的不安和学校的环境也算是坚持到了学有所成的地步。到了大学环境开始松散不知道该做什么,只觉得在不挂科的基础上能往上考多少就考多少,等到秋招来临才发现自己有多么幼稚无能,今年九月份初才发现自己原来连一个求职的方向都没有。因为之前做过前后端一体的课设,算是有过了解,而对于其他岗位连做什么都不知道,因此这一个半个月在越来越焦虑的同时埋头苦学,事到如今想要活下去我似乎只能走前端这条路了,9月初先是靠着虚假夸大能力的简历得到一些笔试来确定了考察的方向,有一个大厂的无笔试面试最终是拒绝了没有勇气去面对。然后在这个基础上埋头苦学,如今也算是搭好了自己前端学习的框架和思考的瞄,可以逐渐给自己扩展新的知识和能力了,但这并不是一件多好的事儿,因为我发现学的越多越焦虑,学的越多便越无力。因为我感觉我如今努力学习的知识都是竞争对手们早就掌握了的东西,我如今困惑追求答案的难题早就被别人解决。别人早就能得心应手地做出项目而我连思考都会卡壳,看着别人的笔试和面经上那些闻所未闻的题目,我才知道别人到底有多强而我有多幼稚,我什么时候才能达到别人那种堪称熟练的能力呢?而且网上的焦虑越多越多,即便是真有这么高的能力最后也大概落得一个低薪打工人的下场,我真的感到迷茫。秋招都快结束了,而我还在继续痛苦的学习之旅,这些天找前端面试发现似乎问的有些简单跟网上搜到的内容不符(可能因为并不是大厂),我是不是本来就没打算被招所以别人懒得细问呢?我不知道,我只能继续总结下去学习下去,不管如何我都要活下去,如果我能早一些准备就好了,如果暑假能意识到现在这个情况就好了,可惜没有如果。种下一棵树的最好时间是十年前,其次是现在,虽然我相信自己的学习能力,但已经错过了最好的时机,只能在焦虑与痛苦中每天坚持学下去。目前的路还有很长很长,先去把typescript看了,再去巩固vue3的基础,再去练习elementui的使用,如果这能找到实习的话就好了。接下来呢?去学uniapp和小程序,不管如何我都要对得起曾经努力的自己。即便我们都感到痛苦,但我心中还是希望我们都能靠自己的努力来获取自己想要的幸福。
紧张的牛牛等一个of...:在担心什么呢,有一手985的学历在,就算是小厂别人都会要的,咱们双非的人更多,多少还在沉沦的,怕什么了
一句话证明你在找工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务