Vj5.26-5.30training

A题
题意大概就是按照差的绝对值升序输出。
先将他排序,然后明白最大值与最小值的差的绝对值最大,最大值与次最小值的差的绝对值第二大,次最大值与次最小值的差的绝对值第三大……以此类推
然后从中间开始向两边输出就行。
#include<bits/stdc++.h>
using namespace std;
//long long per = 31560000;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,i,j;
        cin>>n;
        int a[n];
        for(int i = 0;i < n;i++)
            cin>>a[i];
        sort(a,a+n);

        for(i = n/2-1,j = n/2;i>=0||j<n;i--,j++)
        {
            if(j<n)
                cout<<a[j]<<" ";
            if(i>=0)
                cout<<a[i]<<" ";

        }
        cout<<endl;
    }
}
B题
找到不递增部分的与最大值差的最大值来求解
#include<bits/stdc++.h>
using namespace std;
//long long per = 31560000;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,i;
        cin>>n;
        int a[n];
        for(i = 0;i<n;i++)
            cin>>a[i];
        int mx = a[0];
        int del=  0;
        for(int i = 0;i<n;i++)
        {

            if(del<mx-a[i])
                del = mx-a[i];
            if(mx<a[i])
                mx = a[i];
        }
        if(del<1)
            cout<<0<<endl;
        else
        {
            cout<<int(log2(del)+1)<<endl;
        }
    }
}
C题
n个人,数组中n个元素是这n个人拥有的财富,然后你可以从中挑选出部分人收集起来他们的所有财富,然后给这部分人平分,财富>=x是富人,问通过这种操作,最多多少个富人
#include<bits/stdc++.h>
using namespace std;
//long long per = 31560000;
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       int n,x;
       cin>>n>>x;
       int  a[n];
       int i;
       for(i = 0;i < n;i++)
        cin>>a[i];
       sort(a,a+n,cmp);
       int cnt = 0;long long s = 0;
       for(i = 0;i < n;i++)
       {
           if(s+a[i]-x>=0)
           {
               s+=a[i]-x;
               cnt++;
           }
           else break;
       }
       cout<<cnt<<endl;
    }
}


D题
先将所有怪兽都爆炸之后剩下的血量家和,然后便利找触发点;用数组c来储存收到上一个怪兽爆炸影响之后剩余血量,用sum来存所有都爆炸之后剩余血量和;找触发点的时候,如果对应c为整数就需要从sum中减去,然后加上自己本身的初始血量,如果为负数,就不用考虑c;
#include<bits/stdc++.h>
using namespace std;
//long long per = 31560000;
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       int n;
       cin>>n;
       long long a[n],b[n],c[n];
       int i;
       for(i = 0;i < n;i++)
        cin>>a[i]>>b[i];
       long long sum = 0;
       for(i = 0;i < n;i++)
       {
           if(i==0)
           {
               c[0] = a[0]-b[n-1];
            }
            else c[i] = a[i]-b[i-1];
            if(c[i]>0)
                sum+=c[i];
       }
       long long s = 1e18;
       for(i = 0;i < n;i++)
       {
           if(c[i]>0)
            s = min(s,sum-c[i]+a[i]);
           else s = min(s,sum+a[i]);
       }
       cout<<s<<endl;
    }
}

E题
先将数组存起来,然后a数组在输入的时候记录正负数的个数;然后再倒着往前遍历两个数组,如果a[i]>b[i]就看看除了a[i]之外剩下的数字里有没有负数,反之就看看有没有正数。
#include<bits/stdc++.h>
using namespace std;
//long long per = 31560000;
int trip = 1;
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int i;
        int a[n],b[n];
        int z = 0,f = 0;
        for(i = 0;i < n;i++)
        {
            cin>>a[i];
            if(a[i]>0)
                z++;
            else if(a[i]<0)
                f++;

        }
        for(i = 0;i < n;i++)
        {
            cin>>b[i];

        }
        int flag = 1;
        for(i = n-1;i>=0;i--)
        {
            if(a[i]>0)
                z--;
            else if(a[i]<0)
                f--;
            if(a[i]<b[i])
            {
                if(z>0)
                    continue;
                else {
                    flag = 0;
                    break;
                }
            }
            else if(a[i]>b[i])
            {
                if(f>0)
                    continue;
                else {
                    flag = 0;
                    break;
                }
            }

        }if(flag==1)
                cout<<"YES"<<endl;
            else cout<<"NO"<<endl;

    }
}


F题
不想看了,,,,脑容量不太够,,,坐等讲题
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;

#define  inf  0x3f3f3f3f
#define ll long long
#define mod 1000000007
#define maxn 1000005
ll f[maxn];
void init(){
    f[0] = 1;
    for (int i=1; i<=maxn; ++i) f[i] = f[i-1] * i % mod;
}
ll fastpow(ll x,ll y){
    ll ans=1;
    ll res=x;
    while(y){
        if(y&1)ans=(ans*res)%mod;
        res=(res*res)%mod;
        y>>=1;
    }
    return ans;
}
ll lucas(ll n,ll k){
    ll ans=1;
    while(n&&k){
        ll nn=n%mod;
        ll kk=k%mod;
        if(nn<kk)return 0;
        ans=ans*f[nn]*fastpow(f[kk]*f[nn-kk]%mod,mod-2)%mod;
        n/=mod;k/=mod;
    }
    return ans;
}
int main(){
    int n;
    int a[200005]={0};
    map<long long int,long long int>mp;
    mp[0]=0;
    scanf("%d",&n);
    int flag=0;
    long long int sum=-1;//因为57行必须初始设定sum=-1
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    long long int item=0,sum2=0;
    for(int i=1;i<=n;i++){
        item+=a[i];
        if(mp.find(item)!=mp.end()){
            sum=max(sum,mp[item]);
        }
        mp[item]=i;
        sum2+=(i-(sum+1));
    }

    printf("%lld\n",sum2);

}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务