Skip to content

北市學科能力競賽

from Yui Huang

zj

年度 題目 題解
2019(全題解) 2169 . 出戰排序 (Arrangement) 我的題解
2170 . 地圖編修 (Map) 我的提解
2171 . 打卡遊戲 (Checkin) 我的題解
2172 . 物種演化 (Evolution) 我的題解
2173 . 搜集寶藏 (Treasure)
2018 e876. Q1 – 配對連線 Link
e877. Q2 – 湖畔大樓 Link
2180 . 勇者冒險 (Adventure)
2181 . 表演節目 (Show)
2182 . 幸運表格 (Lucky)
2183 . 保護女王 (Queen)
2017 e884. Q3 數字密碼鎖
2009 . 數字密碼鎖(Lock)
2008 . 格鬥大賽(Fight)
2016 c230. 松鼠旅行
1419 . 飛天李晴(?) (Sunny) Link
c231. 踩地雷
1420 . 地雷區 (Mine) Link
1422 . 小米雷射 (Laser)
1424 . 手續費 (Fee) Link
2015 1033 . 大黑馬(Underdog)
1034 . 搶救雷恩大兵 (Saving Ryan) Link
1091 . 猜謎遊戲 (Guess)
2014 e878. Q2 得分高手
1268 . 得分高手 (Master) Link
e881. Q2 極限運動
1037 . 水晶球 (Crystal Ball)
1280 . 領土 (Territory)
1281 . 加密密鑰 (Key)
2013 a828. 間隔數 ( number ) Link
a829. 主機排程( schedule ) Link
a830. 超級細菌( bacteria ) Link
2012 a565. 2.p&q的邂逅 Link
2010 d887. 1.山脈種類(chain) Link
d889. 2.黑傑克(jack) Link
d890. 3.禮物分配(gift) Link
d084. 4.人造衛星(meteor)
2009 d544. 1. 海藻(algae)
d545. 2. 抽紙牌(poker) Link
d546. 3. 剪多邊形(molding)
d547. 4. 秘密(secrets) Link
d548. 5. 購物網站(web)
2008 1576 . 餅乾製作(cookie)
1577 . 萬用字元(wildcard)
1578 . 調和三角(triangle)
1580 . 火星圍棋(go)
2007 b125. 積木的拼疊問題(Bricks)
b127. 會議中心(Room)
b128. 序列長度問題(Sequence)
2006 b119. 售票系統 (Sales)
b120. 函數計算 (Comp)
b121. 井字遊戲 (TTT)
b122. 用餐地點 (Lunch)
b123. 最大矩形 (Area) Link
b124. 送愛心到肯大亞 (Care)

2169 . 出戰排序 (Arrangement)

約瑟夫問題

#include <bits/stdc++.h>
using namespace std;

int f(int n, int m) {
    int pos = 0;  
    for (int i = 2; i <= n; i++) {
        pos = (pos + m) % i;
    }
    return pos + 1;  
}

int main() {
    int n, k;
    cin >> n >> k;
    
    for (int m = 2; m <= 30000; m++) {
        if (f(n, m) == k) {
            cout << m << endl;
            return 0;
        }
    }
    
    cout << 0 << endl;
    return 0;
}

2170 . 地圖編修 (Map)

題解
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
#define nnn " "
#define nnnn "\n----------------------\n"
#define N 105

int n,mod;
int v[N][N];

int fpow(int x,int y){
    if(!y)return 1;
    if(y&1)return fpow(x,y-1)*x%mod;
    int z=fpow(x,y/2)%mod;
    return z*z%mod;
}

void out(){
    cout<<nnnn;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++){
            cout<<v[i][j]<<nnn;
        }
        cout<<nn;
    }
    cout<<nnnn;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    //istringstream cin("3 101 \
69 59 89 \
5 4 2 \
3 6 7 \
2 0 1");
    cin>>n>>mod;

    for(int i=1;i<=n+1;i++){//存入陣列
        for(int j=1;j<=n;j++){
            cin>>v[j][n-i+2];
        }
    }

    for(int i=1;i<=n;i++){

        //例外狀況交換(目標為0)
        if(v[i][i]==0){
            for(int j=i;j<=n;j++){//往後找不是0的
                if(v[j][i]!=0){//找到不是0的
                    for(int k=1;k<=n+1;k++){//交換
                        swap(v[i][k],v[j][k]);
                    }
                    break;
                }
            }
        }

        //第i個變成1
        int e=fpow(v[i][i],mod-2);
        for(int j=i;j<=n+1;j++){//前面都是0了,往後乘模逆元就好
            v[i][j]=v[i][j]*e%mod;
        }

        //其他變成0
        for(int j=1;j<=n;j++){
            if(j==i)continue;//跳過自己

            int tmp=v[j][i];//要先存起來不然會被改掉
            for(int k=i;k<=n+1;k++){
                v[j][k]= ((v[j][k] - (v[i][k]*tmp))%mod+mod)%mod;
            }
        }

    }

    for(int i=n;i>=1;i--)cout<<v[i][n+1]<<" ";
}

2171 . 打卡遊戲 (Checkin)

#include<bits/stdc++.h>
using namespace std;
#define nn "\n"
#define nnn " "
#define N 2000
// #define int long long

int n,m,x,y,z,k;
vector<int>v[N];
bool vis[N];
int odd=0;

void dfs(int f){
    vis[f]=true;
    if(v[f].size()&1){
        odd++;
    }
    for(int i:v[f]){
        if(!vis[i]){
            dfs(i);
        }
    }
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    //istringstream cin("3 3 100 20 5 \
1 1 5 \
1 2 4 \
3 3 8 \
2 1 4 \
2 2 4");
    cin>>n>>m>>x>>x>>k;
    for(int i=0;i<k;i++){
        cin>>x>>y>>z;
        v[x].push_back(y+n);
        v[y+n].push_back(x);
    }
    int ans=0;
    for(int i=1;i<=n+m;i++){
        if(!vis[i] && v[i].size()){
            odd=0;
            dfs(i);
            ans+=max( odd/2 , 1);
        }
    }
    cout<<ans;
}

2172 . 物種演化 (Evolution)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 200000
#define nn "\n"

int n,m;

vector<int>v[N];
bool vis[N];
int tin[N],tout[N],d[N],t=0,lgn;
vector<vector<int>> anc(N,vector<int>(17,-1));

void dfs(int f){
    vis[f]=true;
    t++;
    tin[f]=t;
    for(int i:v[f]){
        if(!vis[i]){
            anc[i][0]=f;
            for(int j=1;j<=lgn;j++){
                if(anc[i][j-1]==-1)break;
                anc[i][j]=anc[anc[i][j-1]][j-1];
            }
            d[i]=d[f]+1;
            dfs(i);
        }
    }
    t++;
    tout[f]=t;
}

int isanc(int a,int b){
    return tin[a]<=tin[b] && tout[a]>=tout[b];
}

int lca(int a,int b){
    if(isanc(a,b))return a;
    if(isanc(b,a))return b;
    for(int j=lgn;j>=0;j--){
        if(anc[a][j]!=-1 && !isanc(anc[a][j],b)){;
            a=anc[a][j];
        }
    }
    return anc[a][0];
}




signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    //istringstream cin("10 5 \
2 9 \
3 9 \
7 9 \
8 5 \
9 5 \
6 1 \
0 1 \
5 4 \
1 4 \
2 3 \
8 6 \
1 7 \
9 5 \
5 0");
    cin>>n>>m;
    lgn=__lg(n);

    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(0);
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        int z=lca(x,y);
        cout<<  d[x]-d[z]+d[y]-d[z]<<nn;
    }
}