2020-05-26 — 习题训练三

Posted a-specter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-05-26 — 习题训练三相关的知识,希望对你有一定的参考价值。

A - Sorted Adjacent Differences

将这串数字按大小排序,找到中间那个做第一个,左一个右一个输出

int main()
{
    int k,n,i,j,a[100010];
    cin>>k;
    while(k--){
        cin>>n;
        for(i=0;i<n;i++){
            cin>>a[i];
        }
        sort(a,a+n);
        for(i=n/2,j=n/2-1;j>=0||i<=n-1;i++,j--){
            if(i<=n-1){
                cout<<a[i]<<" ";
            }
            if(j>=0){
                cout<<a[j]<<" ";
            }
        }
        cout<<endl;
    }
    return 0;
}

B - Powered Addition

变成一个不递减的数列,数列里的每一个数都得大于之前最大的那一个,与之前最大的哪一项相差最大的,求需要的时间

int main()
{
    ll k,n,i,j,a[100010],z=0;
    cin>>k;
    while(k--){
        cin>>n;
        cin>>a[0];
        ll max1=a[0],max2=-1,sum=0;
        for(i=1;i<n;i++){
            cin>>a[i];
            max1=max(max1,a[i]);
            max2=max(max2,max1-a[i]);
        }
        j=1;
        z=0;
        while(sum<max2){
            sum+=j;
            j*=2;
            z++;
        }
        cout<<z<<endl;
    }
    return 0;
}

C - Middle Class

对所有的数求和,判断平均能不能大于x,不可以就从最小的开始,去掉,再判断

int main()
{
    ll k,n,m,i,j,z=0;
    cin>>k;
    while(k--){
        ll a[100010];
        cin>>n>>m;
        ll sum=0;
        for(i=0;i<n;i++){
            cin>>a[i];
            sum+=a[i];
        }
        if(sum/n>=m){
            cout<<n<<endl;
        }else{
            sort(a,a+n);
            for(i=0;i<n-1;i++){
                sum-=a[i];
                if(sum/(n-i-1)>=m){
                    cout<<n-i-1<<endl;
                    break;
                }
            }
            if(i==n-1){
                cout<<0<<endl;
            }
        }

    }
    return 0;
}

D - Circle of Monsters

找一个地方开头呗,前边那个就炸不着它了,看看哪浪费的最少呗

ll a[300005][2],b[300005];
int main()
{
    ll k,n,m,i,j=0,minn=1e18;
    cin>>k;
    while(k--)
    {
       ll n,i,sum=0;
       minn=1e18;
       cin>>n;
       for(i=0;i<n;i++){
            scanf("%lld%lld",&a[i][0],&a[i][1]);
        }
        for(i=0; i<n; i++)
        {
            if(i==0)
            {
                b[0]=max(0ll,a[0][0]-a[n-1][1]);
            }
            else{
                b[i]=max(0ll,a[i][0]-a[i-1][1]);
            }
            sum+=b[i];
        }
        for(i=0;i<n;i++){
            minn=min(minn,sum-b[i]+a[i][0]);
        }
       printf("%lld
",minn);
    }
    return 0;
}

E - Kind Anton

如果第二个序列的数比第一个序列同位上的数大,在此之前原序列得有1才行

如果第二个序列的数比第一个序列同位上的数小,在此之前原序列得有-1才行

ll a[100100];
int main()
{
    int k,n,d,x,b,flag,i;
    cin>>k;
    while(k--){
        cin>>n;
        for(i=0;i<n;i++){
            cin>>a[i];
        }
        d=0;x=0,flag=0;
        for(i=0;i<n;i++){
            cin>>b;
            if(b>a[i]&&d==0&&flag==0){
                cout<<"NO"<<endl;
                flag=1;
            }
            if(b<a[i]&&x==0&&flag==0){
                cout<<"NO"<<endl;
                flag=1;
            }
            if(a[i]==1){
                d=1;
            }
            if(a[i]==-1){
                x=1;
            }
        }
        if(flag==0){
            cout<<"YES"<<endl;
        }
    }

    return 0;
}

F - Eugene and an array

(i,j)的子串和为零,前缀和sum[i]==sum[j]

(我没想出来QWQ)

技术图片
map<ll,ll>vis;
ll sum[200005];
int main()
{
    int n,a;
    cin>>n;
    vis[0]=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        sum[i]=sum[i-1]+a;
    }
    ll s=0;
    int l=0,r=1;
    while(r<=n)
    {
        while(vis[sum[r]])
        {
            vis[sum[l]]=0;
            l++;
        }
        vis[sum[r]]=1;
        s+=r-l;
        r++;
    }
    cout<<s<<endl;
    return 0;
}
View Code

 

以上是关于2020-05-26 — 习题训练三的主要内容,如果未能解决你的问题,请参考以下文章

2020-05-26 — 习题训练三

2020-05-26 — 习题训练三

2020-05-26 — 习题训练三

2020-05-26 — 习题训练三

习题训练计划 2020 05 26

习题训练计划 2020 05 26