蓝桥杯 过年【算法赛】

问题描述

蓝桥村的村民们正准备迎接新年。他们计划宰杀 NN 头猪,以庆祝一整年的辛勤劳作和丰收。每头猪的初始位置位于下标 xixi​,所有 xixi​ 均为偶数,保证没有两头猪初始位置相同。

当猪意识到人类打算宰杀它们时,并非束手就擒。它们会主动移动以寻找同伴,遵循以下规则:

  • 每头猪以恒定速率朝着最近的另一头猪移动。若有多头猪距离相同,则选择朝着坐标更小的猪移动。所有猪的移动速度相同。
  • 当两只猪相遇在同一坐标时,它们会融合成一个整体,被视为一头猪。

当所有猪聚集在同一坐标点时停止移动。现在村民们想要确定最终猪群聚集的确切坐标位置,请你帮助解决这个问题。

输入格式

第一行输入一个整数 N(2≤N≤105)N(2≤N≤105) 表示猪的数量。

第二行输入 NN 个整数 x1,x2,⋯ ,xN(−109≤xi≤109)x1​,x2​,⋯,xN​(−109≤xi​≤109) 表示每头猪的坐标,保证 x1,x2,⋯xNx1​,x2​,⋯xN​ 是偶数,且各不相同。

输出格式

输出一个整数表示答案。

样例输入

复制代码
5
0 -2 -4 10 2

样例输出

复制代码
3

有点蠢,我自己模拟了一次运动过程,不过练习了链表,全部超时

#include <iostream>

#include <algorithm>

#include <list>

#include <cmath>

#include <climits>

using namespace std;

int main()

{

int n;

cin>>n;

double nums[n];

for(int i=0; i<n; i++){

cin>>nums[i];

}

sort(nums, nums+n);

list<double> nums_l;

for(int i=0; i<n; i++){

nums_l.push_back(nums[i]);

}

// for(list<int>::iterator i=nums_l.begin(); i != nums_l.end(); i++){

// cout<<*i<<" ";

// }

// cout<<endl;

int cur_n = n;

while(1){

double min_step = INT_MAX;

for(list<double>::iterator i=nums_l.begin(); i != nums_l.end(); i++){

double step;

if(i == nums_l.begin()){

continue;

}

else{

list<double>::iterator pre_iter = i;

list<double>::iterator next_iter = i;

--pre_iter;

++next_iter;

if(next_iter == nums_l.end()){

step = (*i - *pre_iter) / 2;

}

else{

step = min(*i - *pre_iter, *next_iter - *i) / 2;

}

min_step = step < min_step ? step : min_step;

}

}

// cout<<"min_step: "<<min_step<<endl;

double delay_step, cur_step;

for(list<double>::iterator i=nums_l.begin(); i != nums_l.end(); i++){

if(i == nums_l.begin()){

delay_step = min_step;

continue;

}

list<double>::iterator pre_iter = i;

list<double>::iterator next_iter = i;

--pre_iter;

++next_iter;

if(next_iter == nums_l.end()){

*i -= min_step;

}

else{

if(*i - *pre_iter <= *next_iter - *i){

cur_step = -min_step;

}

else{

cur_step = min_step;

}

}

*pre_iter += delay_step;

delay_step = cur_step;

}

// cout<<"Moving!"<<endl;

// for(list<int>::iterator i=nums_l.begin(); i != nums_l.end(); i++){

// cout<<*i<<" ";

// }

// cout<<endl;

list<double>::iterator cur_it=nums_l.begin();

while(cur_it != nums_l.end()){

if(cur_it == nums_l.begin()){

++cur_it;

continue;

}

list<double>::iterator pre_iter = cur_it;

--pre_iter;

if(*pre_iter == *cur_it){

cur_it = nums_l.erase(cur_it);

}

else{

++cur_it;

}

}

if(nums_l.size() == 1){

break;

}

// cout<<"Merging!"<<endl;

// for(list<int>::iterator i=nums_l.begin(); i != nums_l.end(); i++){

// cout<<*i<<" ";

// }

// cout<<endl;

}

cout<<*nums_l.begin();

return 0;

}

其实求中点就好了,从数据范围应该要看得出来模拟一定超时

#include <iostream>

#include <algorithm>

#include <list>

#include <cmath>

#include <climits>

using namespace std;

int main()

{

int n;

cin>>n;

double nums[n];

for(int i=0; i<n; i++){

cin>>nums[i];

}

sort(nums, nums+n);

cout<<(nums[0]+nums[n-1])/2;

return 0;

}

相关推荐
合作小小程序员小小店11 分钟前
桌面预测类开发,桌面%性别,姓名预测%系统开发,基于python,scikit-learn机器学习算法(sklearn)实现,分类算法,CSV无数据库
python·算法·机器学习·scikit-learn·sklearn
洛_尘27 分钟前
数据结构--4:栈和队列
java·数据结构·算法
Jiezcode37 分钟前
LeetCode 138.随机链表的复制
数据结构·c++·算法·leetcode·链表
zhengjianyang&12341 分钟前
美团滑块-[behavior] 加密分析
javascript·经验分享·爬虫·算法·node.js
翟天保Steven43 分钟前
ITK-基于欧拉变换与质心对齐的二维刚性配准算法
算法
Simucal1 小时前
基于物理引导粒子群算法的Si基GaN功率器件特性精准拟合
人工智能·算法·生成对抗网络
烦躁的大鼻嘎3 小时前
【Linux】深入探索多线程编程:从互斥锁到高性能线程池实战
linux·运维·服务器·开发语言·c++·算法·ubuntu
今后1233 小时前
【数据结构】快速排序与归并排序的实现
数据结构·算法·归并排序·快速排序
南莺莺3 小时前
树的存储结构
数据结构·算法·
Sapphire~3 小时前
重学JS-009 --- JavaScript算法与数据结构(九)Javascript 方法
javascript·数据结构·算法