思路:
如下 ,从三个小点开始 ,像不像bfs ,没错就是bfs ,拿个map来记录每个点是否有树或者人, 把可以放的位置放进答案容器里就行了。
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int N=200010;
const int mod = 998244353;
map<int,bool>mp;
vector<int>res;
int a[N];
typedef pair<int,int> pii;
queue<pii>Q;
int main()
{
int n,m;
cin>>n>>m;
int cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
mp[a[i]]=true;
Q.push({1,a[i]-1});
Q.push({1,a[i]+1});
}
ll rr=0;
int maxv=0;
while(Q.size())
{
auto t =Q.front();
Q.pop();
int loc = t.second;
int dis = t.first;
if(!mp[loc])
{
m--;
res.push_back(loc);
mp[loc]=true;
rr += dis;
if(!m) break;
Q.push({dis+1,loc+1});
Q.push({dis+1,loc-1});
}
}
cout<<rr<<endl;
for(int i=0;i<res.size();i++)
cout<<res[i]<<' ';
cout<<endl;
return 0;
}
下面发一份超时代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int N=200010;
const int mod = 998244353;
map<int,bool>mp;
vector<int>res[N];
int a[N];
int main()
{
int n,m;
cin>>n>>m;
int cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
mp[a[i]]=true;
}
ll rr=0;
int maxv=0;
for(int t=1;;t++)
{
for(int j=0;j<n;j++)
{
if(!mp.count(a[j]-t))
{
res[t].push_back(a[j]-t);
mp[a[j]-t]=true;
cnt++;
rr+=t;
}
if(cnt>=m) break;
if(!mp.count(a[j]+t))
{
res[t].push_back(a[j]+t);
mp[a[j]+t]=true;
cnt++;
rr+=t;
}
if(cnt>=m) break;
}
if(cnt>=m) {
maxv=t;
break;
}
}
cout<<rr<<endl;
for(int i=1;i<=maxv;i++)
for(int j=0;j<res[i].size();j++)
cout<<res[i][j]<<' ';
cout<<endl;
return 0;
}
这样确实慢 ,做了好多无用功。遍历了好多遍数组,真有你的。