链接: https://codeforces.com/contest/1283/problem/D
题意:给定n个不同的整数点,让你找m个不同的整数点,使得这m个点到到这n个点最小距离之和最小。
思路:贪心一下,首先每个点的x+1和x-1两个坐标到这个点的距离是最短的,之后是x+2,x-2,再之后是x+3,x-3,那么可以想到bfs,首先把n个点存入队列中,找与他们距离为1的点,之后再bfs距离为2的点,如此这个过程直到找到m个点.
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
const int mod = 1e9+;
const int maxn = 2e5+;
typedef long long ll;
queue<pair<int,int> > q;
map<int,bool> vis;//用map记录是否访问过
vector<int> v;
int main(){
int n,m;cin>>n>>m;
while(n--){
int t;cin>>t;
vis[t] = ;
q.push({,t+}),q.push({,t-}); //首先存距离为1的点
}
ll ans = ;
while( m> && !q.empty() ){
pair<int,int> cur = q.front() ;
q.pop() ;
if(vis[cur.second]!=){//如果没有遍历过
m--;
v.push_back(cur.second );
ans+=cur.first;
vis[cur.second] = ;
if(vis[cur.second+] != ) q.push({cur.first+,cur.second+});//距离+1,入队列
if(vis[cur.second-] != )q.push({cur.first+,cur.second-}); //同上
}
}
cout<<ans<<endl;
for(int i = ;i<v.size() ;i++){
cout<<v[i]<<" ";
}
return ;
}