宁波理工D-爱丽丝,来扫除啦!(Easy Version)

爱丽丝,来扫除啦!(Easy Version)

https://ac.nowcoder.com/acm/contest/84302/D

本题链接

分享一下宁波理工D题我的做法(本人大一菜鸡,思路不好请见谅):

1.做题思路

看题目来说爱丽丝释放魔法能清理一条线上的垃圾,那么首先想到的就是斜率相同,所以先用浮点数来对斜率做判断,但是有特殊情况:

1.x==0&&y==0 :此时涉及到原点那么不管放哪里都会被射到;

2.x==0 || y==0 :此时代表射在轴线上;

3.第一象限和第三象限直接求斜率会使得斜率相同但是其实射不到;

2.做题方法

1.对于1.1我们可以直接用x==0&&y==0让一个cnt=1,初始时cnt=0,在最后时对答案进行+cnt的操作输出;

2.对于1.3我们可以用map进行算斜率把相同的map[i]++,但是第一第三象限斜率会取得相同,所以我们要进行上下分区,那么map的存储量也是原来的两倍(1e5*2);

3.对于1.2中的操作我们可以进行一个map的操作储存在斜率取不到的地方(取不到的地方就是y/x的最大值1e5*2以外的地方);

4.最后再用map进行爆搜搜出最大的加cnt;

#include <map>
using namespace std;
 
int main()
{
    map<double, int> op;
    int n, cnt = 0, ans = 0;
    cin >> n;
    double x, y;
 
    while (n > 0)
    {
        cin >> x >> y;
 
        if (y >= 0)   //区分x正半轴
        {
            if (y == 0 && x == 0)  //判断原点
            {
                cnt++;
            }
            else if (x == 0)     //由于上下分区所以不需要进行正负半轴的区分
            {
                op[0]++;
            }
            else if (y == 0)
            {
               if(x>0) op[1e10]++; //这里要区分正负半轴分别map
               else op[1e10+1]++; 
            }
            else
            {
                double ol = x / y;  
                op[ol]++;  //打普通斜率map
            }
        }
        else  //下半部分
        {
            if (x == 0){
    			op[1e10L+3]++;//卡住极限取斜率取不到的值
    		}	else	{
        double ol = x / y;
       op[ol + 1e5L]++;
    }
        }
         
        n--;
    }
 
    for (auto &[ol, c] : op)  //map遍历最大
    {
        ans = max(ans, c);
    }
 
    cout << ans + cnt << endl;  //最大加上是否有原点
    return 0;
}
全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务