题目链接:Leaving the Bar
这到题目看着很像 01分数规划 ,但是求的东西使得我们无法用分数规划去做。
我们考虑任意三对向量,一定可以组合成模在要求范围之内,但是如果我们每次根据距离原点的距离去贪心,可能会碰到刚好两对向量卡死的情况。所以我们随机化即可,每次随机打乱向量,然后再贪心。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,res[N],tx,ty;
struct node{int x,y,id;}t[N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>t[i].x>>t[i].y,t[i].id=i;
while(true){
random_shuffle(t+1,t+1+n); tx=ty=0LL;
for(int i=1;i<=n;i++){
int d1=(tx+t[i].x)*(tx+t[i].x)+(ty+t[i].y)*(ty+t[i].y);
int d2=(tx-t[i].x)*(tx-t[i].x)+(ty-t[i].y)*(ty-t[i].y);
if(d1<=d2) res[t[i].id]=1,tx+=t[i].x,ty+=t[i].y;
else res[t[i].id]=-1,tx-=t[i].x,ty-=t[i].y;
}
if(tx*tx+ty*ty<=1500000*1LL*1500000){
for(int i=1;i<=n;i++) printf("%lld ",res[i]); return 0;
}
}
return 0;
}