宁波理工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;
}