埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛(A E F )

版权声明:欢迎复制!!! https://blog.csdn.net/qq_37493070/article/details/79951003

题目链接 :https://www.nowcoder.com/acm/contest/91#question

A 移动的可以看成从自己旁边移过来的 A B C A—>C 和 A—->B —->C一样

#include<bits/stdc++.h>
using namespace std;
int a[100003];
int b[100003];
int main()
{

    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        for(int i=1;i<=n;i++)
        {

            cin>>b[i];
            a[i]-=b[i];
        }
        long long ans=a[1];
        long long sum=abs(a[1]);
        for(int i=2;i<=n;i++)
        {

            ans+=a[i];
            sum+=abs(ans);

        }
        cout<<sum<<endl;

    }
    return 0;
}

E 规律题


#include<bits/stdc++.h>
using namespace std;
int main()
{


    int n;
    cin>>n;
    long long a= (1LL<<n);
    cout<<a;
    return 0;
}

F 也是规律题

写成二进制
1
10
100
101
1000
1001
1010
然后会发现 位数为n的二进制会有 F(N)个( F()为斐波那契数) 然后拼n
例如 样例10 (0 1 1 2 3 5 7 12 斐波那契数)
10> 0+1+1+2+3所以 10最高位是第5位 10000 ,而 10000的时候有 0+1+1+2+3+1(10000这一个) 还剩下 2个 再找 发现 2==0+1+1 所以把2位最大的拼上去(10) 那么答案就是 10010 也就是 18

#include<bits/stdc++.h>
using namespace std;
#define ll long long
long long a[70];
int main()
{  // freopen("in","r",stdin);
    a[1]=1;
    a[2]=1;
    for(int i=3;i<59;i++)
    a[i]=a[i-1]+a[i-2];


    for(int i=1;i<59;i++)
    a[i]+=a[i-1];

    int t;
    cin>>t;
    long long k=0;
    while(t--)
    {
        long long n;
        k=0;
        cin>>n;

        while(n>0)
        {
            int i;

            for( i=0;i<=59;i++)
            {
                if(a[i]>n) break;


            }
            if(a[i-1]==n)
            {
                int kk=1;
                while(kk<i)
                {
                    if(kk%2==1)
                    k=k|(1LL<<(i-kk-1));kk++;


                }

                n=0;
            }
            else
            {
                k=k|(1LL<<(i-1));
                n-=a[i-1];
                n--;

            }


        }
        cout<<k<<endl;

    }

    return 0;
}

L找和为K的倍数的最长子序列
子序列不是应该可以不连续吗? 这一点想不通 ,不知道咋过了 估计数据水
lower_bound 用的时候都没有排序…真….一脸懵逼


#include<bits/stdc++.h>
using namespace std;
long long a[100003];
int main()
{  // freopen("in","r",stdin);
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]+=a[i-1];
        a[i]%=m;
        if(a[i]==0) a[i]=m;
    }
    int maxx=0;
    for(int i=n;i>=1;i--)
    {


        long long k=m-a[i];
        int o=lower_bound(a,a+n,k)-a;
        if(a[o]==k&&maxx<i-o)
        {

            maxx=i-o;

        }



    }

    cout<<maxx<<endl;


    return 0;
}

正解




#include<bits/stdc++.h>
using namespace std;
long long a[1000003];
long long b[1000003];
int main()
{  // freopen("in","r",stdin);
     int n,m;
     cin>>n>>m;
     long long sum=0;
     long long maxx=0;
     for(int i=1;i<=n;i++){

        int k;
        cin>>k;
        sum=(sum+k)%m;
        maxx=max(maxx,sum);
        a[sum]=i;
        if(!b[sum] ) b[sum]=i;

     }  b[0]=0;
        long long ans=0;
        for(int i=0;i<=maxx;i++)
        {
            if(a[i]!=b[i]) {ans=max(ans,a[i]-b[i]) ;}


        }
        cout<<ans<<endl;


    return 0;
}






阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页