2020-05-26 — 习题训练 题解

Posted kingstar1

tags:

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

A题,要想前面的差小于后面的,只要排一下序然后先输出中间的,在输出前一个,在输出后一个,然后一直一前一后输出就可以了。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        vector<LL>p;
        p.clear();
        for(int i=0;i<n;i++)
        {
            LL a;
            cin>>a;
            p.push_back(a);
        }
        sort(p.begin(),p.begin()+n);
        int num1=n/2-1+1,num2=n/2-1-1;
        cout<<p[(n-1)/2]<<" ";
        if(n%2==1)
        {
            num1=n/2+1,num2=n/2-1;
        }
        int num=1,num3=p[n/2];
        while(num<n)
        {
            if(num%2==1)
            {
                cout<<p[num1]<<" "; 
                num1++;
            }
            else 
            {
                
                cout<<p[num2]<<" ";
                num2--;
            }
            num++;
        }
        cout<<endl;
    }
}

 

B题,先算出第i秒增加多少,根据题意前面的一定比后面的大,贪心的从前往后比较,记录最大值与后面的比较,记录最少需要的秒数

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL a[40];
int main()
{
    int t;
    cin>>t;
    a[0]=0;
    for(int i=1;i<=35;i++)
    {
        a[i]=(a[i-1]+1)*2-1;
    }
    while(t--)
    {
        int n;
        cin>>n;
        LL num1=0,num2=0,ans=0;
        cin>>num1;
        for(int i=1;i<n;i++)
        {
            LL b;
            cin>>b;
            if(b>=num1)
            {
                num1=b;
            }
            else
            {
                for(int i=1;i<35;i++)
                {
                    if(b+a[i]>=num1)
                    {
                        num2=i;
                        if(num2>ans)ans=num2;
                        break;
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
}

 

C题,先排序,从最大的那边向后求平均值,直到小于最少财富。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,x;
        cin>>n>>x;
        LL a[100005];
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            
        }
        sort(a,a+n);
        LL num=0,num2=0,ans=0;
        for(int i=n-1;i>=0;i--)
        {
            num2++;
            num+=a[i];
            if(num/num2<x)
            {
                break;
            }
            else ans=num2;
        }
        cout<<ans<<endl;
    }
}

 

D题,先根据所有的怪物会被前一个炸多少血算出剩余需要花费的数量,然后从前向后遍历一遍,算出每一个需要的数量,就是需要花费的数量减去前一个炸掉的加上这个怪物本来的血量,取最小值即可。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL a[300005],b[300005],c[300005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        LL max=0,num=0,ans=1e18;
        for(int i=0;i<n;i++)
        {
            scanf("%lld%lld",&a[i],&b[i]);
            if(i!=0)
            {
                if(a[i]>=b[i-1])
                {
                    c[i]=a[i]-b[i-1];
                }
                else c[i]=0;
                num+=c[i];
            }
            
        }
        if(a[0]>=b[n-1])c[0]=a[0]-b[n-1];
        else c[0]=0;
        num+=c[0];
        for(int i=0;i<n;i++)
        {
            max=num-c[i]+a[i];
            if(max<ans)ans=max;
        }
        cout<<ans<<endl;
    }
}

 

E题,统计第一个数组中1的数量和-1的数量,然后让第二个数组从后向前遍历,如果ai>0一的数量减一个,小于0 ,-1的数量建一个,然后如果bi>ai就看1的个数,小于就看-1的个数。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL a[100005],b[100005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        LL num1=0,num2=0,flag=0;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(a[i]<0)num1++;
            if(a[i]>0)num2++;
        }
        for(int i=0;i<n;i++)
        {
            cin>>b[i];
        }
        for(int i=n-1;i>=0;i--)
        {
            if(a[i]==1)num2--;
            if(a[i]==-1)num1--;
            if(b[i]<a[i]&&num1==0||b[i]>a[i]&&num2==0)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

 

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

2020-05-26 — 习题训练三

2020-05-26 — 习题训练三

习题训练计划 2020 05 26

习题训练计划 2020 05 26

2020-05-26 — 习题训练三

2020-05-26 — 习题训练三