当前位置: 首页 > news >正文

C. Bertown Subway

题目解析 

        通过分析题目得到,车站之间回形成环。题目要求的是通过改变两个数p[i],使得车站到其他车站的可达数量最大化(便利最大化)。因为每一个i对应的pi值都是不同的,所以只能通过交换两个数来实现。

        将车站到车站之间的路径可以构成环,环中的每个车站都可以到达其他的车站,若环的长度是a,则车站可达的数量为a的2次方

        题目要求可达的数量最大化,则只需要让两个长度最大的环连接到一起即可。若这两个环的长度分别为a和b,则两个连接在一起形成的大环的可达数量(便利度)为(a + b)^ 2。

利用上述思路编写的代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define MAXN 100000 + 5
#define ll long longint p[MAXN];//存储站信息
bool visited[MAXN];//用于判断当前站是否被访问了,避免重复访问环
int main()
{vector<ll> v;//存储所有环的长度int n;ll r = 0;//结果cin >> n;for(int i = 1; i <= n; i++)cin >> p[i];for(int i = 1; i <= n; i++)//i表示的是本站{if(visited[i] == true)continue;//利用后续的代码求环的长度,这一部分是最重要的ll cnt = 1;int x = p[i];//x是本站的目的站visited[x] = true;while(x != i)//如果说没有形成环继续执行{x = p[x];visited[x] = true;cnt++;//这个cnt是环的长度}v.push_back(cnt);//将这个环的长度放进数组中}sort(v.begin(), v.end());//从小到大进行排序if(v.size() >= 2)//其中有大于等于2的环数{r = v[v.size() - 2] + v[v.size() - 1];//现在r的值是最大的两个环长度之和r = r * r;//现在r的值是将两个环组合在一起的数对总和//(从一个站到另一个站的所有方式之和)for(int i = 0; i < v.size() - 2; i++){r += v[i] * v[i];}}else//只有一个环,直接是长度的平方{r = v[0] * v[0];}cout << r;return 0;
}

相关文章:

  • 解决戴尔电脑No bootable devices found问题
  • 数据结构——选择题—查漏补缺
  • b站视频如何下载到电脑上
  • 神经网络模型的统计学具现
  • 【MPC】模型预测控制笔记 (4):约束输出反馈MPC
  • crackme009
  • FPGA基础 -- Verilog 结构建模
  • 百度下拉框出词技术解密:72小时出下拉词软件原理分享
  • 零基础开始的网工之路第二十一天------性能优化
  • 从 native 获取 AndroidId,Frida 获取 native 堆栈
  • Vue.js第二节
  • 使用duckduckgo_search python api 进行免费且不限次数的搜索
  • 【unitrix】 3.1 新基本结构体(types1.rs)
  • Python从入门到精通
  • WebRTC(六):ICE协议
  • c++面试题(24)-----数组中出现次数超过一半的数字
  • VisionMaster标定板像素标定,测量尺寸以及opencv/C++实现
  • 【C语言极简自学笔记】重讲运算符
  • 自动打电话软件设计与实现
  • FPGA基础 -- Verilog行为级建模之alawys语句
  • tp框架做响应式网站/制作网站的app
  • 桂林 网站 建设/成crm软件
  • 淄博网站建设 招聘/郑州seo方案
  • 做网站要多少/seo学习
  • 网站项目书范文/怎么做市场营销和推广
  • 自己做传奇网站/品牌营销策略