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

窝本来是参加的现场赛的,现场赛相对于网赛,多了两题,有些题也不一样,可能签到题也多了两道……

Wasserstein Distance

这题蛮坑喔….现场时因为wa一发就没再去看,去啃异或了,最后才发现wa的一发是因为卡在longlong了T_T
贪心思想,直接从左面往右面扔就行了,用前缀和完美解决。

// #include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const  int N = 1e5+1;
long long a[N],b[N];
int main()
{
    // freopen("in.txt","r",stdin);
    int t,n;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        scanf("%d",&n);
        for(int i = 1; i <= n; ++i){
            scanf("%lld",&a[i]);
            a[i] += a[i-1];
        }
        for(int j = 1; j <= n; ++j){
            scanf("%lld",&b[j]);
            b[j] += b[j-1];
        }
        long long sum = 0;
        for(int i = 1; i <= n; ++i){
            sum += fabs(a[i]-b[i]);
        }
        printf("%lld\n",sum);
    }
    return 0;
}

小Y吃苹果

呃,这题实实在在的签到题….直接上代码吧

// #include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const  int N = 1e5+1;
int main()
{
    // freopen("in.txt","r",stdin);
    int t,n;
    cin>>t;
    cout<<(1<<t)<<endl;
    return 0;
}

1 + 2 = 3?

一道找规律的题,如果你多列几组答案的话会发现,满足条件的答案都是没有相邻的1的,然后听大佬说此时可以选择数位dp(恕蒟蒻不会QAQ),我的做法是继续找规律….
这里写图片描述
有了这个规律就可以写啦

#include<algorithm>
#include<iostream>
#include<stdio.h>
using namespace std;
const  int N = 60;
long long fib[N],two[N];
int main()
{
    fib[0] = 1,fib[1] = 2, two[0] = 1;
    // freopen("in.txt","r",stdin);
    for(int i = 2; i < N; ++i){
        fib[i] = fib[i-1]+fib[i-2];
    }
    for(int i = 1; i < N; ++i){
        two[i] = two[i-1]*2;
    }
    int t;
    cin>>t;
    while(t--)
    {
        long long n;
        scanf("%lld",&n);
        long long sum = 0;
        //至于为什么从58开始,是因为从第58项开始斐波那契数就已经大于1e12了
        for(int i = 58; i >= 0; --i){
            if(fib[i]<=n){
                sum += two[i];
                n-=fib[i];
            }
            if(n<=0) break;
        }
        cout<<sum<<endl;
    }
    return 0;
}

K序列

题意:求最长子序列和%k为0
做法dp,待补。

猜你喜欢

转载自blog.csdn.net/eternally831143/article/details/79968129