蓝桥杯 过年【算法赛】

问题描述

蓝桥村的村民们正准备迎接新年。他们计划宰杀 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;

}

相关推荐
何其有幸.2 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
东阳马生架构3 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
老饼讲解-BP神经网络4 小时前
一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
算法·决策树·机器学习
何其有幸.4 小时前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
不会计算机的捞地4 小时前
【数据结构入门训练DAY-24】美国大选
数据结构·算法
明月看潮生5 小时前
青少年编程与数学 02-018 C++数据结构与算法 11课题、分治
c++·算法·青少年编程·编程与数学
Echo``5 小时前
2:QT联合HALCON编程—图像显示放大缩小
开发语言·c++·图像处理·qt·算法
.似水5 小时前
2025.4.22_C_可变参数列表
java·c语言·算法
天真小巫5 小时前
2025.4.26总结
职场和发展
triticale5 小时前
【蓝桥杯】P12165 [蓝桥杯 2025 省 C/Java A] 最短距离
java·蓝桥杯