(建议直接观看后面图片,图片更生动哦)

首先看这个题目,这个题目也是比较简单得,最主要就是读懂这个题目,因为我感觉这个题目还是比较绕人的。

首先我们来分析一下题目,“小明可以使用 Cij个航天纪念币让博物馆管理员告诉他 i,i+1,…,j 这些房子里人员总数的奇偶性。” 这句话什么意思呢,也就是说,我可以花费一定的金钱来知道一个区间内房子里人员总数的奇偶性。并且花费的钱和我选择的区间之间有一定的关系,也就是说,每个区间有固定的花费金钱数。而这些金钱数不一定是相同的。比如,如果我想知道第一个房间到第五个房间总人数的奇偶性,那我们就要付,1-5这个区间所对应的金钱。同理要想知道2-4这些个房间的奇偶性,那就需要花费这个区间所要的金钱数。每个区间的金钱数并不一定是一样,而题目让我们要求的便是,在花费最少的钱的情况下,去得到所有答案。

好,那我们在回到这个题目。这个题目只给我们房间的奇偶性,然后让我们去求哪些房间里有人。首先我们观察题目,“其中某些房间里面有 1 个人(且不会超过 1 个)” 这说明一个房间里要不就是没人,那么这个房间的奇偶性就是偶数。如果一个房间里有人而且人数又不能,那么就代表这个房间人数为奇数,换而言之,只要在知道一个房间里的奇偶性那么就可以判断出是否有人。好,那么我们先不考虑金钱,我们来讨论一下:我需要知道哪些房间的奇偶性才可以得出结果。

假设我们知道1-1,2-2, 3-3,4-4, 5-5。很明显,可以。

假设我们知道1-1, 1-2, 1-3, 1-4, 1-5. 那么第一个房间数就是1-1,第二个就是2-1。。。很明显,我们也可以知道。

那么加上钱,整个结构就可以由三部分组成,即房间区间的起点终点和金钱。我么们可以看出这个结构是不是和图的结构相似呢?图结点是由什么组成,两个顶点,一个权值。而我们这是什么?是一个区间,i-j,和相应区间对应得金钱数。那么如果我们把起点和终点当作两个顶点,那么金钱便是所对应的权值。

细心的同学可能已经发现,我们这样比较应该是有一点出入的。比如,如何表示i-i房间呢?一般情况下我们在图的结构中,是没有问同一个点的权值是多少这种问题的。那么我们该如何进行转换呢?

可能一些同学已经想到,既然不能问同一个起点的权值,那么我为什么不自己在最开始在加一个顶点呢?  很好,倘如我们在最开始在加一顶点,那么就变成了,原本i到i的区间,变成了i-1到i,在数学上也就变成了,左开右闭得区间。那么这样图的构造问题就解决了。

条件一:如果你想求一个房间得奇偶,那么你就只有知道i-1到i这个区间得奇偶性,也就是说你需要知道x-> i的奇偶和x->i+1的奇偶性,或者i-1->x得奇偶和i->x得奇偶,而这两个都不可避免地含有i,因此要想知道i的奇偶,就必须包含i。也就是必须要过i点。

条件二:那么在看,我们是不是最少也需要5个权值才行,因为有五个房间,就像解方程,你有五个未知量,那么你总要有五个方程才行。

最后根据这两点便可以得出:我们想要最优,那么久必须是知道五个权值,经过六个点,那这个问题就正好可以转换成最小生成树问题。

最后,考虑到边数远远大于点数,我们选择使用kruskal算法跑出最小生成树。时间问题,具体算法就不再直接给出。

#include <cstdlib>
#include <iostream>
#include <algorithm>
#include<vector>using namespace std;const int MAX_VERTEX_NUM = 2001;struct Edge
{int u, v, w;    //u indicates the begin point of an edge, //v indicates the end point of an edge,//w indicates the value of an edge;
};bool edges_cmp(const Edge & lhs, const Edge & rhs)
{return lhs.w < rhs.w;
}int ufset_find(int x, int ufset[])
{int t = x;while (x != ufset[x]) {x = ufset[x];}while (t != x)      //compress the path{int buf = ufset[t];ufset[t] = x;t = buf;}return x;
}int main()
{int n, m = 0;vector<Edge> edges;int ufset[MAX_VERTEX_NUM];  //disjoint set data structurelong long sum;cin >> n;Edge e;for( int i = 1; i <= n; i++ ) {for( int j = i; j <= n ; j++ ) {e.u = i - 1;e.v = j;cin >> e.w;edges.push_back(e);m++;}} sort(edges.begin(), edges.end(), edges_cmp);for (int i = 0; i <= n; ++i) {ufset[i] = i;}sum = 0;int k = 0;for (int i = 0; i < m; ++i) {int u = ufset_find(edges[i].u, ufset);int v = ufset_find(edges[i].v, ufset);if( u != v ) {if(v>u)ufset[v] = u;elseufset[u] = v;sum += edges[i].w;k++;if(k == n)break;}}cout << sum;return 0;
}

2022年安徽省机器人大赛——程序设计赛道 第十三届安徽省大学生程序设计大赛————I 玩捉迷藏相关推荐

  1. 2019计算机应用设计大赛,关于举办2019年桂林理工大学网页设计大赛暨第十三届广西大学生计算机应用大赛选拔赛的通知...

    校属各单位.各有关部门: 为提高我校学生计算机应用水平,培养学生的实践能力.创新意识和团队精神,同时选拔优秀学生参加2019年第十三届广西大学生计算机应用大赛,根据自治区教育厅<关于举办2019 ...

  2. 广西计算机应用设计大赛,关于举办2019年桂林理工大学网页设计大赛暨第十三届广西大学生计算机应用大赛选拔赛的通知...

    校属各单位.各有关部门: 为提高我校学生计算机应用水平,培养学生的实践能力.创新意识和团队精神,同时选拔优秀学生参加2019年第十三届广西大学生计算机应用大赛,根据自治区教育厅<关于举办2019 ...

  3. 黑龙江计算机比赛,第十二届东北地区大学生程序设计竞赛和第十三届黑龙江省大学生程序设计竞赛在我校成功举行...

    2018年5月18日至20日,第十三届黑龙江省大学生程序设计竞赛和第十二届东北地区大学生程序设计竞赛在我校隆重举行.副校长刘胜辉.教务处长宋清昆分别代表组委会致欢迎辞,并宣布比赛开幕.黑龙江省计算机学 ...

  4. 河南省第十三届ICPC大学生程序设计竞赛 【部分题题解】

    比赛参加了,打的很垃圾. 霸爷说过:一个人要不是比别人大几个数量级,其实是很难比别人强的. 努力变强,到达巅峰. 目录 A: 祝融传火 E: Dance with a stick F: 图像识别 H: ...

  5. 秦皇岛计算机编程大赛,南科大学子在第六届中国大学生程序设计竞赛(秦皇岛)获多个奖项...

    2020年10月18日,第六届中国大学生程序设计竞赛(China Collegiate Programming Contest,简称CCPC)(秦皇岛)暨2020中国大学生程序设计竞赛女生专场在秦皇岛 ...

  6. 新型发明创造大赛计算机类,关于组织参加成都市第三十三届青少年科技创新大赛的通知...

    成都市第三十三届青少年科技创新大赛已经开始报名,请各班认真组织,积极动员同学们参加比赛.现将有关事项提醒如下: 一.项目列表与负责教师: 1)创造发明--信息组夏小刚老师负责 2)科学论文--信息组郑 ...

  7. 华农c语言程序设计教程陈湘骥,华农数信学子在第44届国际大学生程序设计竞赛勇夺金牌...

    数信学子在第44届国际大学生程序设计竞赛勇夺金牌 中国区决赛 上海站 南京站 哈尔滨站 近日,第44届国际大学程序设计竞赛(中国区决赛)在西北工业大学落下帷幕.我校数学与信息学院.软件学院的张宏海.何 ...

  8. “统信杯” 第十七届黑龙江省大学生程序设计竞赛

    "统信杯" 第十七届黑龙江省大学生程序设计竞赛 前言 题目 A. Bookshelf Filling C. Tree Division D. Collision Detector ...

  9. 挑战程序设计竞赛_我系首次参加第六届中国大学生程序设计竞赛网络预选赛

    点击上方蓝字关注  「龙外信息工程系」 讲述有温度的故事    传递有态度的思想 2020年9月20日12时至17时,第六届中国大学生程序设计竞赛网络赛预选赛在杭州电子科技大学OJ成功举办,黑龙江外国 ...

最新文章

  1. RHEL7.0系列 修改字符终端分辨率
  2. 概率密度与概率的关系
  3. Android 触摸事件处理机制
  4. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
  5. 2014\Province_C_C++_B\7 六角填数
  6. 30是什么意思_“29+16”变“30+18”是什么意思?独立艺术院校有何优势?报考需要注意什么?...
  7. 【数字信号处理】——Python频谱绘制
  8. Linux下c/c++项目代码覆盖率的产生方法
  9. 云服务器ECS共享标准型S6全新发布, 行业内最具性价比
  10. gen_fsm之门禁管理
  11. 百度定位安卓6.0权限问题
  12. 【Linux网络编程】使用GDB调试程序
  13. MSM8937-MSM8953 I2C 配置调试指南
  14. 统一网络存储NAS+SAN=FAS
  15. LeetCode 1101. The Earliest Moment When Everyone Become Friends
  16. 外贸B2C系列:facebook使用教程
  17. 平台如何接入微信支付
  18. VR学习(Demo)以及在Unity3D上的项目
  19. 联想服务器重装系统按什么键,联想重装系统按哪个键
  20. 在Ubuntu 13.10 中安装配置 Hadoop 2.3.X - Tong Zeng

热门文章

  1. Invalid non-ASCII or control character in header: 0x8BBE ASP.NET Core 文件下载报错
  2. SPSS + AMOS 结构方程模型(SEM)
  3. 微风:新手如何自学平面设计
  4. java开发愤怒的小鸟_Java实现愤怒的小鸟AngryBirds游戏源码
  5. 通过有线共享无线的方法
  6. ceac linux考试题题型,CEAC考试平面的设计题目.doc
  7. 禁止Xmind更新弹窗提示
  8. 云计算和大数据课程开课简介
  9. JavaScript基础算法——摧毁数组
  10. KingbaseES通过sys_waldump解析wal日志