题目链接
题目大意
题目的意思给定n个不同的整数点,让你找m个不同的整数点,使得这m个点到这n个点的最小距离之和最小。(题目大意有点解释不清
思路
看到最小距离其实就要想到bfs
易错警示
1:注意数据过大,判断数组要用map
2:还有ans要开longlong ,记得输出要lld(wa了一发
代码
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
using namespace std;
map<int,bool> prime;//判断数据过大要用map当数组
queue<pair<int,int> >pos;//第一个为距离,第二个为位置
int n,m,i,j,x;
long long ans;//注意要用ans可能数据为long long
vector<int> a;
int main()
{
scanf("%d %d",&n,&m);
while(n--)
{
scanf("%d",&x);
prime[x]=1;
pos.push({1,x+1});
pos.push({1,x-1});
}
while(m&&!pos.empty())
{
pair<int,int> cur=pos.front();
pos.pop();
if(prime[cur.second]==0)
{
prime[cur.second]=1;//标志数组
ans=ans+cur.first;
a.push_back(cur.second);
m=m-1;
pos.push({cur.first+1,cur.second+1});
pos.push({cur.first+1,cur.second-1});
}
}
printf("%lld\n",ans);//注意为lld很容易忘记
int len=a.size();
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
return 0;
}