• 最大生成树 BZOJ3943 [Usaco2015 Feb]SuperBull


     

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 374  Solved: 217
    [Submit][Status][Discuss]

    Description

    Bessie and her friends are playing hoofball in the annual Superbull championship, and Farmer John is
     in charge of making the tournament as exciting as possible. A total of N (1 <= N <= 2000) teams are
     playing in the Superbull. Each team is assigned a distinct integer team ID in the range 1...2^30-1 
    to distinguish it from the other teams. The Superbull is an elimination tournament -- after every ga
    me, Farmer John chooses which team to eliminate from the Superbull, and the eliminated team can no l
    onger play in any more games. The Superbull ends when only one team remains.Farmer John notices a ve
    ry unusual property about the scores in matches! In any game, the combined score of the two teams al
    ways ends up being the bitwise exclusive OR (XOR) of the two team IDs. For example, if teams 12 and 
    20 were to play, then 24 points would be scored in that game, since 01100 XOR 10100 = 11000.Farmer J
    ohn believes that the more points are scored in a game, the more exciting the game is. Because of th
    is, he wants to choose a series of games to be played such that the total number of points scored in
     the Superbull is maximized. Please help Farmer John organize the matches.
    贝西和她的朋友们在参加一年一度的“犇”(足)球锦标赛。FJ的任务是让这场锦标赛尽可能地好看。一共有N支球
    队参加这场比赛,每支球队都有一个特有的取值在1-230-1之间的整数编号(即:所有球队编号各不相同)。“犇”
    锦标赛是一个淘汰赛制的比赛——每场比赛过后,FJ选择一支球队淘汰,淘汰了的球队将不能再参加比赛。锦标赛
    在只有一支球队留下的时候就结束了。FJ发现了一个神奇的规律:在任意一场比赛中,这场比赛的得分是参加比赛
    两队的编号的异或(Xor)值。例如:编号为12的队伍和编号为20的队伍之间的比赛的得分是24分,因为 12(01100) 
    Xor 20(10100) = 24(11000)。FJ相信比赛的得分越高,比赛就越好看,因此,他希望安排一个比赛顺序,使得所
    有比赛的得分和最高。请帮助FJ决定比赛的顺序

    Input

    The first line contains the single integer N. The following N lines contain the N team IDs.
    第一行包含一个整数N接下来的N行包含N个整数,第i个整数代表第i支队伍的编号, 1<=N<=2000
     
     

    Output

    Output the maximum possible number of points that can be scored in the Superbull.
    一行,一个整数,表示锦标赛的所有比赛的得分的最大值

    Sample Input

    4
    3
    6
    9
    10

    Sample Output

    37

    HINT

    样例解释:

    FJ先让编号为3和编号为9的队伍进行比赛,然后让编号为9的队伍赢得比赛(淘汰编号为6的队伍),现在

    剩下了编号为6910的队伍。然后他让编号为6和编号为9的队伍比赛,然后让编号为6的队伍赢得比赛。现在编号为6

    10的队伍留了下来最后让编号为6和编号为10的队伍比赛,让编号为10的队伍赢得比赛。所有比赛的得分和就是:(

    3Xor9)+(6Xor9)+(6Xor10)=10+15+12=37

    Source

    Silver

    水题涨自信

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int n,cnt,tot;
     7 long long ans;
     8 int data[2010],fa[2010];
     9 struct dt{
    10     int x,y,dis;
    11 }edge[4000010];
    12 bool cmp(const dt&aa,const dt&bb){
    13     return aa.dis>bb.dis;
    14 }
    15 int find(int x){
    16     if(x==fa[x]) return x;
    17     return fa[x]=find(fa[x]);
    18 }
    19 int main(){
    20     scanf("%d",&n);
    21     for(int i=1;i<=n;i++) scanf("%d",&data[i]);
    22     for(int i=1;i<=n;i++)
    23         for(int j=1;j<=n;j++){
    24             edge[++cnt].x=i;
    25             edge[cnt].y=j;
    26             edge[cnt].dis=data[i]^data[j];
    27         }
    28     sort(edge+1,edge+cnt+1,cmp);
    29     for(int i=1;i<=n;i++) fa[i]=i;
    30     int f1=0,f2=0;
    31     for(int i=1;i<=cnt;i++){
    32         f1=find(edge[i].x);
    33         f2=find(edge[i].y);
    34         if(f1!=f2){
    35             ans+=(long long)edge[i].dis;
    36             tot++;
    37             fa[f1]=f2;
    38         }
    39         if(tot==n-1) break;
    40     }
    41     printf("%lld",ans);
    42     return 0;
    43 }
  • 相关阅读:
    这 100 道 Python 题,拿去刷!!!
    快速入门 TensorFlow2 模型部署
    零基础入门 Kubernetes,你需要知道这些
    Java 面试必考难点,这一个教程全搞定
    Flask实战:如何从零开发“知乎”
    关于layui表格渲染templet解析单元格的问题
    清除input输入框的历史记录
    phpmyadmin导入导出大数据文件的办法
    yiiaseInvalidCallException The cookie collection is read only.
    Yii2.0关闭自带的debug功能
  • 原文地址:https://www.cnblogs.com/zwube/p/7077657.html
Copyright © 2020-2023  润新知