1. 程式人生 > >埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校金馬五校賽(部分題解)

埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校金馬五校賽(部分題解)

窩本來是參加的現場賽的,現場賽相對於網賽,多了兩題,有些題也不一樣,可能簽到題也多了兩道……

這題蠻坑喔….現場時因為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的,然後聽大佬說此時可以選擇數位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,待補。