• AtCoder Beginner Contest 139 解题报告


    F

    • 题意: 给出n个点,可以任意选择其中一些点相加,求离源点的最远距离
    • 思路: 将每个点都看着一个向量,相加满足平行四边形法则,则向量夹角只有锐角和直角时才会变长.对每个向量按极角排序,由于n只有100,顺序枚举剩下的n-1个向量(贪心加角度最相近的)并更新答案.
    using namespace std;
    typedef pair<int,int> pii;
    const int N = 1e3+10;
    
    struct point {
        double x,y;
        point(double x=0,double y=0):x(x),y(y){}
        bool operator < (const point &rhs)const{
            return atan2(y,x) < atan2(rhs.y, rhs.x);
        }
    }p[N];
    
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;++i){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        sort(p,p+n);
        double ans = 0;
        for(int i=0;i<n;++i){
            double x = 0,y = 0;
            int j = i;
            do{
                x += p[j].x, y += p[j].y;
                ans = max(ans,x*x+y*y);
                j = (j+1)%n;
            }while(i!=j);
        }
        printf("%.15lf
    ",sqrt(ans));
        return 0;
    }
    
    

    E

    • 题意: 给出n*(n-1)的矩阵A,每一列代表一个人(A_{ij})表示第i个人第j次的对战目标,求满足每个人都按(A_i)顺序对战且一轮最多对战一次的最小对战轮数
    • 思路: 每个人记录当前对战的位置和上一轮对战的轮数,将当前可以进行的对战信息加入队列中,然后在队列中取得当前轮的对战,再去更新下一轮即可.
    const int N = 1e3+10;
    int a[N][N],ci[N],ls[N];
    int n;
    struct node{
        int u,v,w;
        node(int u=0,int v=0,int w=0):u(u),v(v),w(w){}
    };
    int main(){
        cin >> n;
        for(int i=1;i<=n;++i){
            for(int j=1;j<n;++j){
                cin >> a[i][j];
            }
            ci[i] = 1;  ls[i] = 0;
        }
        int sign = 0;
        int r =0;
        queue<node> q;
        node cur;
        for(int i=1;i<=n;++i){  // 第一轮
            if(ls[i]==1)    continue;
            int  to = a[i][1];
            if(a[to][1]==i){
                ls[to] = 1; ls[i] = 1;
                q.push({i,to,1});
            }
        }
        while(!q.empty()){      
            cur = q.front();    q.pop();    r = cur.w;
    // cout << cur.u << ' ' << cur.v << ' ' << cur.w << endl;
            ci[cur.u]++; ci[cur.v]++;
            int to = a[cur.u][ci[cur.u]];
            if(a[to][ci[to]]==cur.u && ls[to]<=cur.w){
                ls[to] = cur.w+1;   ls[cur.u] = cur.w+1;
                q.push(node{cur.u,to,cur.w+1}); 
            }
            to = a[cur.v][ci[cur.v]];
            if(a[to][ci[to]]==cur.v && ls[to]<=cur.w){
                ls[to] = cur.w+1;   ls[cur.v] = cur.w+1;
                q.push(node{cur.v,to,cur.w+1});
            }
        }
        for(int i=1;i<=n;++i){
            if(ci[i]!=n){
                sign = 1;break;
            }
        }
        if(sign)   cout << -1 << endl;
        else cout << r << endl;
        return 0;
    }
    
  • 相关阅读:
    POJ 2255. Tree Recovery
    Ural 1011. Conductors
    Ural 1010. Discrete Function
    算法导论学习 之 解递归式
    算法导论学习 之 渐进符号
    kubernetes-集群构建
    kubernetes-集群备份和恢复
    kubernetes-概念
    Kubernetes-常用命令
    kubernetes-单机实验(入门)
  • 原文地址:https://www.cnblogs.com/xxrlz/p/11444286.html
Copyright © 2020-2023  润新知