埃森哲杯第十六屆上海大學程序設計聯賽春季賽暨上海高校金馬五校賽(A E F )

題目鏈接 :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;
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章