NP问题

博客探讨了NP问题在特定条件(n<=100)下的解决方案,指出直线移动时点的位置变化,并证明了直线经过的点数与最终答案的关系。文章提到了一种错误的解题思路以及AC代码实现。
摘要由CSDN通过智能技术生成

NP问题
(n<=100)
我觉得出题人并不是为了考验心理而出,而是因为大家的想法中n必须是这个范围
——————————————————————————————————————————————
一条直线左边的点数和右边的点数不会变 (直线上的点根据需要去定义在左边或右边)
这个很好证,每次直线的移动会使一个点更换位置,而直线上的点可以根据需要定义,因为最后统计答案的直线上的数和在直线上的先后无关
所以直接统计出直线x=A经过的点是第k个点,然后答案就只可能是y轴上的第k(下端有k-1点)个点或n-k+1(上端有k-1个点)个点,然后排一下序就做完了
——————————————————————————————————————————————
P.S 比赛的时候想了一个做法,但知道现在都没调出来
我们发现每次旋转后,其实就会到达第一个大于原来斜率的斜率(最大斜率除外),开个桶维护一下就好了

错误做法的代码

#include<bits/stdc++.h>
using namespace std;

const int N=110;
const int AA=1000010;
int x[N],y[N],n,A,cot[N];
struct mess{
   
    int kx,ky,num,y;
}q[N][N];
bool ans[AA];
bool MAX(int xx1,int yy1,int xx2,int yy2){
   
	if(yy1==0) return 0;
	if(yy2==0) return 1;
	 if((xx1<0&&xx2>0)||(xx1>0&&xx2<0)){
   
	 	return 1ll*yy2*xx1<1ll*yy1*xx2;
	 }
	 return 1ll*xx1*yy2>1ll*xx2*yy1;
}
bool cmp(mess x,mess y){
   
	if(x.kx==0||y.kx==0){
   
		return abs(x.kx)>abs(y.kx);
	}
   if((x.kx<0&&y.kx>0)||(x.kx>0&&y.kx<0)) return x.ky*y.kx>x.kx*y.ky; 
   return x
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值