CodeForcesdiv1:995C - Leaving the Bar(随机算法+贪心)
For a vector →v=(x,y)v→=(x,y), define |v|=√x2+y2|v|=x2+y2.
Allen had a bit too much to drink at the bar, which is at the origin. There are nn vectors →v1,→v2,⋯,→vnv1→,v2→,⋯,vn→. Allen will make nn moves. As Allen's sense of direction is impaired, during the ii-th move he will either move in the direction →vivi→ or −→vi−vi→. In other words, if his position is currently p=(x,y)p=(x,y), he will either move to p+→vip+vi→ or p−→vip−vi→.
Allen doesn't want to wander too far from home (which happens to also be the bar). You need to help him figure out a sequence of moves (a sequence of signs for the vectors) such that his final position pp satisfies |p|≤1.5⋅106|p|≤1.5⋅106 so that he can stay safe.
The first line contains a single integer nn (1≤n≤1051≤n≤105) — the number of moves.
Each of the following lines contains two space-separated integers xixi and yiyi, meaning that →vi=(xi,yi)vi→=(xi,yi). We have that |vi|≤106|vi|≤106 for all ii.
Output a single line containing nn integers c1,c2,⋯,cnc1,c2,⋯,cn, each of which is either 11 or −1−1. Your solution is correct if the value of p=∑ni=1ci→vip=∑i=1ncivi→, satisfies |p|≤1.5⋅106|p|≤1.5⋅106.
It can be shown that a solution always exists under the given constraints.
3
999999 0
0 999999
999999 0
1 1 -1
1
-824590 246031
1
8
-67761 603277
640586 -396671
46147 -122580
569609 -2112
400 914208
131792 309779
-850150 -486293
5272 721899
1 1 1 1 1 1 1 -1
题意:给定一些向量,你可以改变它的符号,使得这些向量之和的长度小于1.5e6。
思路:考虑到每条边的长度小于1e6,所以任意两条边的向量和长度小于1.414e6<1.5e6。任意三条边的向量和(可以改变方向)的长度也成立,下面给出证明...
所以我们贪心, 保证向量和离原点更近. 然后下面的代码AC了,然后又被FST了.是因为每次我贪心原则是一样的.最后的结果有可能大于1.5e6. 我们需要加一些随机性, 多次贪心,直到结果满足题意.(这里随机的作用就算多次贪心,直到满足)
证明:每三个向量abc中都能找到两个向量合起来 <= 1e6,然后不断合并,最后只会剩下一个或者两个向量。
对于a和b,1,若ab小于60度,其中一个转向,则变为大于120度,<1e6;2,ab角度大于120度,则其向量和的长度小于1e6。3,角度在60到120度之间,那么第三边c,不论怎么放,都或与a或与b满足上面的关系,使得其向量和长度小于1e6,那么一直这样合并,最后只剩下一边或者两边,而两边的情况最坏为1.414e6
FST代码,WA79:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
const ll p=;
ll ans[maxn+],x[maxn+],y[maxn+];
ll X,Y,P;
int main()
{
int N,i,j; P=p*p;scanf("%d",&N);
for(i=;i<=N;i++){
scanf("%I64d%I64d",&x[i],&y[i]);
if(X>=&&Y>=&&x[i]<=&&y[i]<=) X+=x[i],Y+=y[i],ans[i]=;
else if(X>=&&Y>=&&x[i]>=&&y[i]>=) X-=x[i],Y-=y[i],ans[i]=-;
else if(X<=&&Y<=&&x[i]<=&&y[i]<=) X-=x[i],Y-=y[i],ans[i]=-;
else if(X<=&&Y<=&&x[i]>=&&y[i]>=) X+=x[i],Y+=y[i],ans[i]=;
else if((X+x[i])*(X+x[i])+(Y+y[i])*(Y+y[i])<(X-x[i])*(X-x[i])+(Y-y[i])*(Y-y[i])) X+=x[i],Y+=y[i],ans[i]=;
else X-=x[i],Y-=y[i],ans[i]=-;
}
for(i=;i<=N;i++) printf("%d ",ans[i]);
return ;
}
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
const ll p=;
ll X,Y,P; int ans[maxn];
struct in{ ll x,y,id; }s[maxn];
int main()
{
int N,i,j; P=p*p;scanf("%d",&N);
for(i=;i<=N;i++){
scanf("%I64d%I64d",&s[i].x,&s[i].y); s[i].id=i;
}
while(true){
random_shuffle(s+,s+N+); X=Y=;
for(i=;i<=N;i++){
if((X+s[i].x)*(X+s[i].x)+(Y+s[i].y)*(Y+s[i].y)>(X-s[i].x)*(X-s[i].x)+(Y-s[i].y)*(Y-s[i].y)) X-=s[i].x,Y-=s[i].y,ans[s[i].id]=-;
else X+=s[i].x,Y+=s[i].y,ans[s[i].id]=;
}
if(X*X+Y*Y<=P) {
for(i=;i<=N;i++) printf("%d ",ans[i]); return ;
}
}
return ;
}
(div1E也是需要随机算法!!!
CodeForcesdiv1:995C - Leaving the Bar(随机算法+贪心)的更多相关文章
- Codeforces 996E Leaving the Bar (随机化)
题目连接:Leaving the Bar 题意:给你n个向量,你可以加这个向量或减这个向量,使得这些向量之和的长度小于1.5e6. 题解: 按照正常的贪心方法,最后的结果有可能大于1.5e6 .这里我 ...
- 浅浅地谈一下随机算法【poj2454】【poj3318】
随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...
- 微信红包中使用的技术:AA收款+随机算法
除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...
- POJ 3318 Matrix Multiplication(随机算法)
题目链接 随机算法使劲水...srand((unsigned)time(0))比srand(NULL)靠谱很多,可能是更加随机. #include <cstdio> #include &l ...
- 抽奖随机算法的技术探讨与C#实现
一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...
- hdu 4712 (随机算法)
第一次听说随机算法,在给的n组数据间随机取两个组比较,当随机次数达到一定量时,答案就出来了. #include<stdio.h> #include<stdlib.h> #inc ...
- 权重随机算法的java实现
一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...
- hdu 4712 Hamming Distance ( 随机算法混过了 )
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU4712+随机算法
随机算法 求n个20位的2进制串的MinDist. Dist:两个串的异或结果中1的个数 /* 随机算法 */ #include<algorithm> #include<iostre ...
随机推荐
- robotframework使用之RIDE的底部的日志没显示怎么办?
问题:RIDE的底部的日志没显示怎么办? 解决办法:在Python27的安装路径下D:\Python27\Lib\site-packages\robotide\contrib\testrunner下的 ...
- 浅谈java反序列化工具ysoserial
前言 关于java反序列化漏洞的原理分析,基本都是在分析使用Apache Commons Collections这个库,造成的反序列化问题.然而,在下载老外的ysoserial工具并仔细看看后,我发现 ...
- 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
include "stdafx.h" #include<iostream> #include<vector> #include<algorithm&g ...
- 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
// ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...
- 开始使用gradle
前提配置gradle环境 每个gradle构建都是以一个脚本开始的.gradle构建默认的名称为build.gradle.当在shell中执行gradle命令时,gradle会去寻找为build.gr ...
- T-SQL简单查询语句(模糊查询)
T-SQL简单查询语句 简单查询: 1.最简单查询(查所有数据) select * from 表名: 注:* 代表所有列 select * from info 2.查询指定列 select code, ...
- 八大排序的python实现
以下是八大排序的python实现,供以后参考,日后扩展 一.插入排序 #-*- coding:utf-8 -*- ''' 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- python中装饰器你真的理解吗?
def w1(func): print('装饰器1....') def w1_in(): print('w1_in.....') func() return w1_in def w2(func): p ...
- Django的标准库django.contrib包介绍(转)
Django.contrib是啥? 1.它是一个强大的功能包,是Django的标准库.2.Django的标准库存放在 django.contrib 包中.每个子包都是一个独立的附加功能包. 这些子包一 ...
- Learning an Optimal Policy: Model-free Methods
http://www.mit.edu/~9.54/fall14/slides/Reinforcement%20Learning%202-Model%20Free.pdf [基于所有.单个样本]