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;
}
posted @ 2025-08-08 19:45  arin876  阅读(34)  评论(0)    收藏  举报