Codeforces - Leaving the Bar

题目链接: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;
}
发布了467 篇原创文章 · 获赞 241 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104055209
bar