2018阿里暑期实习线上编程题——数星星

题目:

对于坐标图中NxN的矩阵图中,每个节点都站着一个人,从(0,0)点往人群中看,有些人能被看到,有些人会被同一直线上的其他人挡住。问对于给定的N,能看到多少人?

其实相当于计算从原点到整个矩阵的点中一共有多少种斜率,但是无法使用集合等容器,所以遍历斜率的复杂度太高。之后和同学讨论,发现一种挺巧妙的方法:对于那些被前面的人挡住的点来说,他的坐标是可以通过约分来得到该点到原点的直线上离原点最近的那个人的坐标的,也就是说,当每个点的x,y坐标都约到互质时,这个点就是挡住后面人的第一个人,所以也就可以转化为遍历每个点,当该点的坐标已经互质时,则计数加一,如果存在公约数,则可以忽略,因为他一定被挡住了。

//检查该节点坐标是否可以约分
bool CheckReduce(int a, int b){
    int minone = a>b?b:a;
    for(int i=2;i<=minone;i++){
        if((a%i)==0&&(b%i)==0)
            return true;
    }
    return false;
}
//由于矩阵关于原点是对称的,所以只需要计算一个三角形。
int FindStar(int N){
    int countN = 0;
    for(int i;i<=N;i++){
        if(i==0){
            countN++;          
            continue;
        }
        for(int j=i+1;j<=N;j++){
            if(!CheckReduce(i,j)){
                countN++;
            }
        }
    }
    return countN*2+1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值