5-18 习题训练题解

A题 将n个数分成两部分,只要将2的n次方和2的1次方 到2的(n/2)-1次方加起来,剩下的加起来,在做差就可以。,代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        long long ans1=0,ans2=0,num=1;
        for(int i=1;i<=n;i++)
        {
             num=num*2;
             if(i<n/2||i==n)ans1+=num;
             else ans2+=num;
        }
        cout<<abs(ans1-ans2)<<endl;
    }
}

B题 先判断n个数中有多少个不同的数,如果不同数的个数大于k就不可以,否则就输出n组有k个不同数的相同序列,其中不同的数要包含已有的数,剩余的在小于n的数里面选就可以。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        set<int>p;
        vector<int>q;
        q.clear();
        p.clear();
        for(int i=1;i<=n;i++)q.push_back(i);
        for(int i=0;i<n;i++)
        {
            int a;
            cin>>a;
            p.insert(a);
        }
        int l=p.size();
        
        if(l>m)
        {
            cout<<-1<<endl;
        }
        else
        {
            int y=n;
            cout<<n*m<<endl;
            for(int i=0;i<n;i++)
            {
                if(p.find(q[i])!=p.end())
                {
                    q.erase(q.begin()+i);
                    i--;
                    n--;
                }
            }
            while(y--)
            {
                
                for (set<int>::iterator it = p.begin(); it != p.end(); ++it)printf("%d ", *it);
                for(int i=0;i<m-l;i++)cout<<q[i]<<" ";
            }
            cout<<endl;
        }
    }
}

C题如果2*a<=b,就最少需要(x+y)*a,否则就需要min(x,y)个b,和max(x,y)-min(x,y)个a。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        LL c,d;
        cin>>c>>d;
        LL a,b;
        cin>>a>>b;
        LL ans=0;
        if(a*2<=b||c*d<=0)
        {
            ans=(abs(c)+abs(d))*a;
        }
        else
        {
            if(c<0)c=c*-1;
            if(d<0)d=d*-1;
            if(c>0&&d>0)ans=min(c,d)*b+(max(c,d)-min(c,d))*a;
        
        }
        cout<<ans<<endl;
    }
}

D题如果只包含0或1就输出原来的字符串,不然就输出字符串长度个01;

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        int l=s.length();
        int flag=0;
        for(int i=0;i<l;i++)
        {
            if(s[i]=='0')
            {
                if(flag==0||flag==1)flag=1;
                else 
                {
                    flag=3;
                    break;
                }
            }
            if(s[i]=='1')
            {
                if(flag==0||flag==2)flag=2;
                else
                {
                    flag=3;
                    break;
                }
            }
         }
         if(flag==2||flag==1||flag==0)cout<<s<<endl; 
         else
         {
             for(int i=0;i<l;i++)cout<<"01";
             cout<<endl; 
         }
    }
 } 

E题判断下都是最小的质量能不能小于最大的范围,以及最大的质量能不能大于最小的范围。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,a,b,c,d;
        cin>>n>>a>>b>>c>>d;
        if((a-b)*n<=c+d&&(a+b)*n>=c-d)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

F题,先预处理对于山峰定义为1,不是山峰就是0,然后利用类似滑动窗口的东西,求出除窗口边上两个元素其余和的最大的一组,最大的那组的和+1就是可以分割的数量。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int a[200005],b[200005];
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];    
        }
        b[1]=0,b[n]=0;
        for(int i=2;i<n;i++)
        {
            if(a[i]>a[i-1]&&a[i]>a[i+1])b[i]=1;
            else b[i]=0;
            if(i<m)sum+=b[i];
        }
        int ans=1;
        int num=sum;
        for(int i=2;i<=n-m+1;i++)
        {
            num=num-b[i]+b[m+i-2];
            if(num>sum)
            {
                ans=i;
                sum=num;
            }
        }
        cout<<sum+1<<" "<<ans<<endl;
    }
}
扫描二维码关注公众号,回复: 11221911 查看本文章

猜你喜欢

转载自www.cnblogs.com/Kingstar1/p/12917909.html