zoukankan      html  css  js  c++  java
  • [Codeforces995C]Leaving the Bar 瞎搞

    大致题意:

      给出平面上n个向量,对于每个向量可以选择正的V或负的-V,求按照选择的向量走完,最后距离原点<=1.5*1e6的一个选择方案

      非正解!!!!!!!!!!

      先按距离原点距离由远到近贪心,贪完后答案若不满足,则进行一次dfs找出正确地路线即可(数据较水)

      也可以每次每次讲向量随机排序然后贪心,直到贪到正确答案为止。

      

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<map>
    #include<stack>
    #include<time.h>
    #include<cstdlib>
    #include<cmath>
    #include<list>
    using namespace std;
    #define MAXN 100100
    #define eps 1e-9
    #define For(i,a,b) for(int i=a;i<=b;i++) 
    #define Fore(i,a,b) for(int i=a;i>=b;i--) 
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    #define mkp make_pair
    #define pb push_back
    #define cr clear()
    #define sz size()
    #define met(a,b) memset(a,b,sizeof(a))
    #define iossy ios::sync_with_stdio(false)
    #define fre freopen
    #define pi acos(-1.0)
    #define inf 1e6+7
    #define Vector Point
    const int Mod=1e9+7;
    typedef unsigned long long ull;
    typedef long long ll;
    int dcmp(double x){
        if(fabs(x)<=eps) return 0;
        return x<0?-1:1;
    }
    struct Point{
        double x,y;
        int id;
        Point(double x=0,double y=0):x(x),y(y) {}
        bool operator < (const Point &a)const{
            if(x==a.x) return y<a.y;
            return x<a.x;
        }
        Point operator - (const Point &a)const{
            return Point(x-a.x,y-a.y);
        }
        Point operator + (const Point &a)const{
            return Point(x+a.x,y+a.y);
        }
        Point operator * (const double &a)const{
            return Point(x*a,y*a);
        }
        Point operator / (const double &a)const{
            return Point(x/a,y/a);
        }
        void read(){
            scanf("%lf%lf",&x,&y);
        }
        void out(){
            cout<<"debug: "<<x<<" "<<y<<endl;
        }
        bool operator == (const Point &a)const{
            return dcmp(x-a.x)==0 && dcmp(y-a.y)==0;
        }
    };
    double Dot(Vector a,Vector b) {
        return a.x*b.x+a.y*b.y;
    }
    double dis(Vector a) {
        return sqrt(Dot(a,a));
    }
    double Cross(Point a,Point b){
        return a.x*b.y-a.y*b.x;
    }
    int Maxx=1500000;
    bool cmp(Point a,Point b){
        return dcmp(dis(a)-dis(b))>0;
    }
    bool check(Point o,Point p1){
        return dcmp(dis(o+p1)-dis(o-p1))<=0;
    }
    int ans[100005];
    Point p[100005];
    int n,mk;
    void dfs(int now,Point o){
        if(mk) return ;
        if(now==n) {
            if(dcmp(dis(o)-Maxx)>0) return ;
            mk=1;
            For(i,0,n-1) {
                if(i) printf(" ");
                printf("%d",ans[i]);
            }
            cout<<endl;
            return ;
        }
        ans[p[now].id]=1;
        dfs(now+1,o+p[now]);
        ans[p[now].id]=-1;
        dfs(now+1,o-p[now]);
    }
    void solve(){
        cin>>n;
        For(i,0,n-1) p[i].read(),p[i].id=i;
        mk=0;
        sort(p,p+n,cmp);
        Point o(0,0);
        For(i,0,n-1){
            if(check(o,p[i])) ans[p[i].id]=1,o=o+p[i];
            else ans[p[i].id]=-1,o=o-p[i];
        }
        if(dcmp(dis(o)-Maxx)<=0) {
            For(i,0,n-1){
                if(i) printf(" ");
                printf("%d",ans[i]);
            }
            cout<<endl;
            return ;
        }
        dfs(0,Point(0,0));    
    }
    int main(){
    //    fre("in.txt","r",stdin);
        int t=0;
         solve();
        return 0;
    }
    贪心+dfs
  • 相关阅读:
    扁平化职能管理三部曲
    [转载]持续交付和DevOps的前世今生
    敏捷项目管理工具-百度效率云
    敏捷项目管理:基础知识与应用实务
    第8章 “敏捷+”创新创业模式
    第7章 "敏捷+"项目管理
    第6章 迭代循环与项目结束
    第5章 发布循环
    第4章 立项与项目启动
    Windows 2003 + IIS6.0 相关 401.1 或 401.2 等问题解决
  • 原文地址:https://www.cnblogs.com/cjbiantai/p/9328905.html
Copyright © 2011-2022 走看看