2023百度之星程序设计大赛初赛第二场
星际航行
经典结论,距离之和sum(|xi-t|)到中位数最小
至于要排成等差,i要到的位置为t+i,要求sum(|xi-(t+i)|)=sum(|xi-i-t|)减掉i之后就又是中位数了
或者三分也可以
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100010;
int n;
int x[N],y[N],z[N];
int a[4];
int b[4];
signed main( )
{
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i]>>z[i];
}
sort(x+1,x+n+1);sort(y+1,y+n+1);sort(z+1,z+n+1);
int mid=(n+1)/2;
for(int i=1;i<=n;i++){
a[1]+=abs(x[i]-x[mid]);
a[2]+=abs(y[i]-y[mid]);
a[3]+=abs(z[i]-z[mid]);
}
for(int i=1;i<=n;i++){
x[i]-=i;y[i]-=i;z[i]-=i;
}sort(x+1,x+n+1);sort(y+1,y+n+1);sort(z+1,z+n+1);
for(int i=1;i<=n;i++){
b[1]+=abs(x[i]-x[mid]);
b[2]+=abs(y[i]-y[mid]);
b[3]+=abs(z[i]-z[mid]);
}
int ans=a[1]+a[2]+b[3];
ans=min(ans,a[1]+b[2]+a[3]);
ans=min(ans,b[1]+a[2]+a[3]);
cout<<ans;
return 0;
}
夏日漫步
简单的bfs
#include<bits/stdc++.h>
using namespace std;
const int N=200010;int n;
int lst[1000010];
int a[N];int d[N];
vector<int> G[N];
int main( )
{
cin>>n;for(int i=0;i<1000010;i++)lst[i]=-1;for(int i=1;i<=n;i++){d[i]=-1;}
for(int i=1;i<=n;i++){
cin>>a[i];
if(lst[a[i]]!=-1)G[lst[a[i]]].push_back(i);
lst[a[i]]=i;
}
queue<int> q;
q.push(1);d[1]=0;
while(!q.empty()){
int u=q.front();q.pop();
for(auto v:G[u]){
if(d[v]==-1){
d[v]=d[u]+1;
q.push(v);
}
}
if(u-1>=1&&d[u-1]==-1){
d[u-1]=d[u]+1;q.push(u-1);
}if(u+1<=n&&d[u+1]==-1){
d[u+1]=d[u]+1;q.push(u+1);
}
}
//for(int i=1;i<=n;i++)cout<<d[i]<<" ";cout<<endl;
cout<<d[n];
return 0;
}
跑步
把所有位置相同的小咪合成一个,放在nw中
对nw必须倒着看是否被前面快的超过,否则会出现这个样例,正解为2,输出3
3
1 2
2 3
3 1
#include<bits/stdc++.h>
#define ft first
#define se second
using namespace std;
const int N=100010;
pair<int,int> w[N];
pair<int,int> nw[N];
int n,nn;
/*
3
1 2
2 3
3 1
*/
int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i].ft>>w[i].se;
sort(w+1,w+n+1);
for(int i=1;i<=n;i++){
int j=i;int mn=w[i].se;
while(j<=n&&w[j].ft==w[i].ft){
mn=min(mn,w[j].se);j++;
}j--;
nw[++nn]={mn,j-i+1};
i=j;
}
int ans=1;
int mn=0;int cnt=0;
for(int i=nn;i>=1;i--){
if(i==nn){
mn=nw[i].ft;cnt=nw[i].se;ans=max(ans,cnt);
continue;
}
if(mn<nw[i].ft){
mn=min(mn,nw[i].ft);cnt+=nw[i].se;
}else {
mn=nw[i].ft;cnt=nw[i].se;
}
ans=max(ans,cnt);
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号