首页 > 其他分享 >P4826 [USACO15FEB] Superbull S题解

P4826 [USACO15FEB] Superbull S题解

时间:2023-08-03 21:34:51浏览次数:41  
标签:10 return 比赛 int 题解 USACO15FEB 球队 P4826 节点

Superbull S题解

题目传送门(可点击)

题面

题目描述

\(Bessie\)和她的朋友们正在一年一度的\(Superbull\)锦标赛中打球,而\(Farmer\) \(John\)负责让比赛尽可能激动人心。总共有N支队伍(\(1 \le N \le 2000\))参加了\(Superbull\)锦标赛。每个团队都有一个\(1...2^{30}−1\)的团队ID。

是一场淘汰赛,即在每场比赛之后,FJ选择淘汰其中一支球队,而被淘汰的球队再也无法参加任何比赛了。当只剩下一支球队时,比赛就结束了。

FJ注意到一个不寻常的事情:在任何游戏中,两个团队的总分是两个团队ID的按位异或(XOR)。例如,如果第\(12\)队和第\(20\)队将参加比赛,则该游戏的得分为\(24\)分,因为\(01100\) XOR \(10100=11000\)。

FJ想要设计一种比赛方案,让所有比赛的得分总和最大。请帮助\(Farmer\) \(John\)组织比赛。

输入格式:第一行包括一个整数N,下面N行每行包括一个队伍的ID。

输出格式:输出一个整数,代表比赛的最大总得分。

输入输出样例

输入 #1


4
3
6
9
10

输出 #1


37

样例解释:

让\(3\)队与\(9\)队进行比赛,并让\(9\)队晋级。然后他让\(6\)队和\(9\)队对决,让\(6\)队获胜。最后,第\(6\)队和第\(10\)队比赛,\(10\)队获胜。
总得分为:\(3\) XOR \(9+6\) XOR \(9+6\) XOR \(10=10+15+12=37\)。

题目描述

有\(n\)个球队,第\(i\)个球队与第\(j\)个球队产生的价值为\(i\)^\(j\),每两个球队在创造了价值之后其中有一个球队就不能再创造价值了,求价值的最大值

思路

因为这道题目是在最小生成树的题单中,那么自然就需要向图论的方向思考了
可以将这道题目中的球队抽象为一个一个的节点,将两个球队创造的价值看为两个节点之间的边权

那么题目就变成了:
有\(n\)个节点,第\(i\)个节点与第\(j\)个节点的边权为\(i\) XOR \(j\),每取了两个节点之间的边权,与其中一个节点有关的边都不能取了,求边权最大和

因为在最开始任意两个球队都可以打比赛,所以每个节点之间应该全部连接起来
所以,就可以将样例抽象成为一个图

                                      

代码实现其实也挺简单的,因为\(n \le 2000\),所以直接暴力枚举所有的可能性就可以了


for(int i=1;i<=n;i++) //枚举端点
{
	for(int j=i+1;j<=n;j++) //枚举另一个端点
   {
		a[++m].v=s[i]^s[j]; //储存边权
		a[m].x=i; //储存一个端点
		a[m].y=j; //储存另一个端点
	}
}

继续分析,因为两个节点在取了边权后有一个节点就不能使用了
所以每一个节点一定只有条或条边与他相连,并且一定端头中的一个的节点只有一条边与之相连,那么就不可能形成环

举个栗子

在\(3\)队与\(9\)队比赛后就肯定有一个队会被淘汰,在这里就假设是\(3\)队,于是图就变成了这样:

接着\(6\)队又胜过了\(9\)队,接着\(10\)队胜过了\(6\)队,图就变成了这样:

如果这个图想产生环那么就必须让\(3\)与\(10\)这两个两侧的点连接
可是因为最后一个节点不论是战败还是胜利都不可能被大于两个节点连接,所以就不可能有环

因为所有的点一定是一个连通图并且没有环,那么这就是一棵
因为题目要求尽可能的让边权最大,所以需要完成的操作就是找出最大生成树

枚举可能性时间复杂度为\(O(\sum_{i=1}^{n} i)\),下面的循环的时间复杂度就是\(O(\sum_{i=1}^{n}i \times h)\),大概就是 \(O(n^2)\)

AC Code

std版


#include <bits/stdc++.h> //code by 未抑郁的刘大狗
using namespace std;
#define int long long //不开 long long 见 10pts 高分
int n, fa[2020], m, s[2020], cnt, ans;
struct node {
    int x, y, v; //分别储存两个节点与边权
} a[2020000];
bool cmp(node a, node b)
{
    return a.v > b.v; //因为是最大生成树,所以以边权为关键字,从小到大排序
}
int find_root(int x) //找根
{
    if (fa[x] == x) //没有爸爸就是根
        return x;
    return find_root(fa[x]); //有爸爸就找爸爸
}
signed main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) //输入
        cin >> s[i];
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            a[++m].v = s[i] ^ s[j]; //储存i与j之间的边的边权
            a[m].x = i; //储存一个节点
            a[m].y = j; //储存另一个节点
        }
    }
    for (int i = 1; i <= 2010; i++) //将爸爸初始化
        fa[i] = i;
    sort(a + 1, a + 1 + m, cmp); //排序,为贪心做准备
    for (int i = 1; i <= m; i++) {
        int x = find_root(a[i].x), y = find_root(a[i].y); //找根
        if (x != y) { //是不是已经连接
            fa[x] = y; //连接
            cnt++; //取了cnt个边
            ans += a[i].v; //边权和为ans
        }
        if (cnt == n - 1) //如果已经取完了
            break; //退出
    }
    cout << ans; //输出答案
    return 0; //养成好习惯
}

copy版


#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,fa[2020],m,s[2020],cnt,ans;
struct node{
	int x,y,v;
}a[2020000];
bool cmp(node a,node b){
	return a.v>b.v;
}int find_root(int x){
	if(fa[x]==x)
		return x;
	return find_root(fa[x]);
}signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>s[i];
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			a[++m].v=s[i]^s[j];
			a[m].x=i;
			a[m].y=j;
		}
	}for(int i=1;i<=2010;i++)
		fa[i]=i;
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=m;i++){
		int x=find_root(a[i].x),y=find_root(a[i].y);
		if(x!=y){
			fa[x]=y;
			cnt++;
			ans+=a[i].v;
		}if(cnt==n-1)
			break;
	}cout<<ans;
    return 0;
}

标签:10,return,比赛,int,题解,USACO15FEB,球队,P4826,节点
From: https://www.cnblogs.com/liudagou/p/17604410.html

相关文章

  • java 同一个对象之间赋值后添加入List中,属性值相互覆盖的问题解决方案
    1、for循环中NEW对象,因为List中存的是对象的引用地址。2、BeanUtils是属于spring框架下beans包下的工具类BeanUtils它提供了对java反射和自省API的包装。它里面还有很多工具类,这篇文章我们介绍一下copyProperties这个方法使用情景一般当我们有两个具有很多相同属性的JavaBean......
  • RTSP流媒体服务器LntonNVR(源码版)平台前端打包出现“UglifyJsPlugin”报错的问题解决
    LntonNVR既有软件版也有硬件版,平台基于RTSP/Onvif协议将前端设备接入,可实现的视频能力有视频监控直播、录像、视频转码分发、检索与回放、云存储、智能告警、国标级联等。平台可将接入的视频流进行转码分发,对外输出的视频流格式包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。......
  • 国标GB28181平台LntonGBS(源码版)国标视频平台在连接MySQL数据库时提示“can’t connect
    LntonGBS国标视频云服务平台不仅支持无缝、完整接入内网或者公网的国标设备,还能够实现全平台、全终端输出。该平台支持将GB/T28181的设备/平台推送的PS流转成ES流,并提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务,实现Web浏览器、手机浏览器、微信端、PC客户端等各终......
  • 【csp2020】 方格取数 题解
    洛谷传送门1.题目大意给定一个\(n*m\)的矩阵,矩阵中每个点\((i,j)\)都有一个权值\(f_{(i,j)}\)。每次可以向上,向下或向右走。问从\((1,1)\)走到\((n,m)\),经过的路径上点的权值之和最大是多少?2.思路这道题我们不难想到动态规划。但是与一般的动规不同的是,本题中有上下右......
  • 【题解】Luogu[P5022] [NOIP2018 提高组] 旅行
    Link因为是道NOIP,那么我们不妨按照考场上的策略一点一点想。先看部分分,有一档有很明显的特征\(n=m-1\)这显然构成一棵树,对于一棵树,我们想把他按照题目的要求遍历完,一定是像dfs的遍历顺序一样,对于一个点,必然遍历完以它为根的子树,才能回到它的父亲节点,于是就有了一个很明显的贪......
  • RTMP流媒体服务器LntonMedia(免费版)视频平台在配置域名/公网的IP之后登陆一直显示服务
    LntonMedia是一款功能强大的视频平台,除了支持视频直播功能,还支持视频点播。它可以处理各种音视频文件,包括手机推流、演示视频、短频、音乐等。您可以通过多种上传方式将这些文件上传到平台上,支持批量上传和大文件上传。我们发现在LntonMedia配置了域名/公网ip后,在登录的时候发生了......
  • 关闭防火墙,主机与虚拟机VMnet8在同一网段,主机无法ping通虚拟机问题解决
    因需要进行oss数据迁移至eos,需要liunx环境,于是在本机上使用虚拟机安装了centos7,安装后ifconfig查看虚拟机ip,网络模式是NAT然后ping主机以及百度网,均可ping通,说明虚拟机网络正常  但是使用xshell后,一直无法连接,主机ping虚拟机,请求超时,以为是虚拟机防火墙问题,关闭虚拟机防火......
  • RTMP流媒体服务器LntonMedia(免费版)平台服务器性能扩张后重启但无法运行的问题解决方案
    LntonMedia支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访问量的要求。在推流方面,LntonMedia支持手机推流,支持短视频、音乐等......
  • 记录使用uview的tabs组件初始化渲染下划线移位问题解决
    问题描述:初始化渲染后tabs的下划线没有居中对其,出现异位。问题分析: 网上很多大佬分析过出现原因了记录下解决的过程: 在各个论坛搜集到解决方案都暂时无效 有使用v-if重新渲染的  有给类赋值偏移值的 有强行转换px的因为各种原因这些方法在自己身上没有奏效所以记......
  • CCPC Changchun 2020 D, Meaningless Sequence题解
    听说是签到题。不难看出设x为i二进制个数下1的个数(还是难的),则a_i=c^x。那么我们只需要考虑所有0到n的个数。当n为1111时,可以得到为(1+c)^n次方,那么我们把答案看成两部分一部分是1到111...和1000到n,那么当si位为1时,可以看成是n去掉前一位后再乘以c,递推得到每一个位置的答案,就是......