SDSC 2018 day2解題報告

10.12考試總結

T1 最近公共祖先

預估得分: 100
實際得分: 20
最大得分: 100
用時:1小時10分 ~1小時20分函數

一看題目就知道確定是找規律題spa

20pts:

就是直接暴力求lca,很簡單excel

100pts:

如下是打的表:code

2
22
142
734
3390
14718
61694
253438
1029118ci

用excel生成一下函數圖像能夠看出,是一個指數函數?
Alt text
臥槽,昨天剛剛看了這東西,爽,這種東東通常都是x^y的加減形式
開始硬湊
由前三項能夠看出x應該與2有關係,不然很差湊出2來,因此x取2it

2的冪次class

2^0 1
2^1 2
2^2 4
2^3 8
2^4 16
2^5 32
2^6 64
2^7 128im

#include<bits/stdc++.h>
#define int long long int
using namespace std;
const int mod=1e9+7;
int n;
int ksm(int a,int b) {
    int res=1;
    while(b) {
        if(b&1) res=(res*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return res;
}
signed main() {
// freopen("commonants.in","r",stdin);
//  freopen("commonants.out","w",stdout);
    cin>>n;
    if(n<=9) {
        if(n==1) {
            cout<<2;
            return 0;
        }
        if(n==2) {
            cout<<22;
            return 0;
        }
        if(n==3) {
            cout<<142;
            return 0;
        }
        if(n==4) {
            cout<<734;
            return 0;
        }
        if(n==5) {
            cout<<3390;
            return 0;
        }
        if(n==6) {
            cout<<14718;
            return 0;
        }
        if(n==7) {
            cout<<61694;
            return 0;
        }
        if(n==8) {
            cout<<253438;
            return 0;
        }
        if(n==9) {
            cout<<1029118;
            return 0;
        }
        //n==10 忘記打表了
    }
    int ans=(ksm(2,2*n+2)-(((4*n)%mod+2)*(ksm(2,n)%mod))-2+mod)%mod;
    while(ans<0)
    {
        ans+=mod;
    }
    ans=(ans+mod)%mod;
    cout<<ans%mod;;
    return 0;
}

錯誤緣由

取模翻車,模出負數來了
應該是統計

(ans%mod+ans)%mod

T2 即時戰略

預估得分:40
實際得分: 40
最大得分: 40
用時: 大約40分鐘

10pts:

傻逼部分,差點忘了打上這部分的分,哦我真是傻逼

40pts

直接暴力統計,暴力計算
複雜度:O(n^4)

100pts

感受上每一個點的最大值,和最小值應該和他附近的點有關
感受能夠dp,若是有空再來搞

#include<bits/stdc++.h>
//#define int long long int
using namespace std;
const int N=444;
int w[N][N],n,h,p,ans;
int ans_max=0,ans_min=2147483647;
int d[N][N];//受損程度
#define fre
int main() {
    #ifdef fre
    freopen("rts.in","r",stdin);
    freopen("r1.out","w",stdout);
    #endif
    cin>>n>>h>>p;
    if(p==1) {
    //10pts
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=h; ++j) {
                scanf("%d",&w[i][j]);
                ans_max=max(w[i][j],ans_max);
                ans_min=min(w[i][j],ans_min);
            }
        cout<<ans_min<<' '<<ans_max;
        return 0;
    }
    //30pts
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=h; ++j)
            scanf("%d",&w[i][j]);
    for(int i=1; i<=n; ++i) { //枚舉投彈點的橫座標
        for(int j=1; j<=h; ++j) { //枚舉投彈點的縱座標
            ans=0;
            for(int k=1; k<=n; ++k) {
                for(int l=1; l<=h; ++l) {
                    d[k][l]=0;
                    int tmp=abs(i-k)+abs(j-l);
                    d[k][l]=max(0,p-tmp);
                    ans+=d[k][l]*w[k][l];
                }
            }
            if(ans>ans_max) ans_max=ans;
            if(ans<ans_min) ans_min=ans;
        }
    }
    cout<<ans_min<<' '<<ans_max;
    #ifndef fre
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}

T3 歐皇

預估得分:25
實際得分:25
最大得分: 40
用時:大約1小時多一點

10pts

w*h<=2 傻逼部分分,手玩就ok
但是我太菜了。不想手玩,因而就去搞搞其餘部分分

25pts

w*h<=8
暴力枚舉每一個棋子放在那個格子裏
臥槽翻車了.....看錯時間

40pts

c==1 一共就一顏色的棋子
可見就是要從ai個棋子裏跳出一部分來放到wh的棋盤上,咱們能夠反過來搞
讓w
h的棋盤放ai個棋子有多少種方案,臥槽,這不是組合數嘛!!
C{nm,ai}i==1
(⊙o⊙)…組合數怎麼求來着.........一個悲慘的故事開始了....

55pts

ai==1 每種顏色的棋子都只有1個
臥槽這不是排列嘛!!!!
(⊙o⊙)…排列怎麼求來着.........又一個悲慘的故事開始了....
等等好像不是,臥槽我不會這一檔

100pts

臥槽我不會求排列和組合,部分分搞不到了,那就只能去搞搞正解了
沒有特殊的限制.....應該去看看題目有什麼特殊的性質或者是要求
兩種方案不一樣當且僅當存在一個格子在兩種方案中一種放
棋子一種不放棋子或放的棋子不同
考慮20pts的作法
枚舉每一個棋子的狀況 .仔細觀察數據範圍能夠看出w,h的範圍很是小<=30
因此能夠直接當作狀態來用
用dp[x][i][j]表示x這種棋子放在i,j格子是的合法狀況
算了,不搞了,不會 ,不過sjp大佬確定會!

#include<bits/stdc++.h>
#define int long long int
using namespace std;
const int mod=1e9+7;
const int N=2019;
int w,h,c;
int a[N],flag;
int C[N][N],visit[N][N];
int askC(int n,int k) {
    if(visit[n][k]) return C[n][k];
    if(k>n)return 0;
    if(n==k||k==0) return 1;
    visit[n][k]=1;
    return C[n][k]=(askC(n-1,k-1)+askC(n-1,k))%mod;
}
int pts2() {
    return askC(w*h,a[1]);
}
signed main() {
    freopen("europe.in","r",stdin);
    freopen("europe.out","w",stdout);
    cin>>w>>h>>c;
    for(int i=1; i<=c; ++i) {
        cin>>a[i];
        if(a[i]!=1) flag=1;
    }
    if(c==1) {//第2檔分
        cout<<pts2()%mod;
        return 0;
    }
    if(w*h<=2) {//第1檔分
        if(!a[1]||!a[2]) {
            cout<<3<<endl;
            return 0;
        } else {
            cout<<0<<endl;
            return 0;
        }
    }
    if(flag==0) { //第3檔分~~~想錯了咕咕咕。,不是排列
        while(1) {
            break;
        }
        cout<<rand()<<15+rand()<<15%mod;
        return 0;
    }
    cout<<rand()<<15+rand()<<15%mod;
    return 0;
}
相關文章
相關標籤/搜索