---
# System prepended metadata

title: 2023NPSC初賽試題
tags: [NPSC]

---

# 2023NPSC初賽試題
[初賽題目](<https://github.com/linn1121/coding-with-C/blob/main/contest_senior.pdf> "Title")
## A.蛋餅愛數樹
__虫合__ 看不懂
## B.巫醫巫醫出題
>解題思路:
>可以直接理解成作業排成問題，等待時間都是T秒，要做的就是對各組每筆資料的X數做計算並排序，由X數最多的開始到所有組別的測資都執行完畢或著都遇到X過後結束。

>Code :
>```cpp
>#include <bits/stdc++.h>
>using namespace std;
>#define 原神 int
>#define 啟動 main
>#define 幫我撐五秒鐘       \
>    ios::sync_with_stdio(false); \
>    cin.tie(nullptr);            \
>    cout.tie(nullptr);
>struct num_of_X
>{
>    int num{0};
>    int pos;
>};
>原神 啟動()
>{
>    幫我撐五秒鐘
>    int N, M, T, timeCost = 0;
>    cin >> N >> M >> T;
>    vector<string> assets(N);
>    vector<num_of_X> Xconuter(M);
>    for (int i = 0; i < N; i++)
>    {   
>        cin >> assets[i];
>        for (int j = 0; j < M; j++)
>        {
>            Xconuter[j].pos = j;
>            if (assets[i][j] == 'X')
>            {
>                Xconuter[j].num++;
>            }
>        }
>    }
>    sort(Xconuter.begin(), Xconuter.end(), [](num_of_Xa, num_of_X b)
>         { return a.num > b.num; });
>    for (int i = 0; i < N; i++)
>    {
>        for (int j = 0; j < M; j++)
>        {
>            timeCost += T;
>            if (assets[i][Xconuter[j].pos] == 'X')
>            {
>                break;
>            }
>        }
>    }
>    cout << timeCost;
>}
>```
>時間複雜度約為$O$($N$+$2$($N$$\times$$M$))
>~~甚麼?優化??不存在的~~
    
--*Written By Chen*
## C.砲打皮皮
皮皮，啟動！
>解題思路:
>反正就是要先找到它的規則。
>$N,M$ 存在以下三種情況:
>- 奇數 $\times$ 奇數
>- 奇數 $\times$ 偶數
>- 偶數 $\times$ 偶數
>
>只要存在奇數的情況所需要選擇的位置數即為該奇數
>而第三種情況只要把每個位置都選一遍就可以使所有位置都被啟動
>因為只要是任一種可以使全部都啟動的情況即為正解，
>所以直接輸出所有位置就可以了，$N\times M$也不會大於$2^{16}$

>Code:
>```cpp
>#include<bits/stdc++.h>
>using namespace std;
>#define 原神 int
>#define 啟動 main
>#define 幫我撐五秒鐘 ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
>原神 啟動 (){
>    幫我撐五秒鐘
>    int n,m;
>    cin>>n>>m;
>    if(n%2!=0){
>        cout<<n<<"\n";
>        for(int i=1;i<=n;i++){
>            cout<<i<<" 1"<<"\n";
>        }
>    }else if(m%2!=0){
>        cout<<m<<"\n";
>        for(int i=1;i<=m;i++){
>            cout<<"1 "<<i<<"\n";
>        }
>    }       
>    else{
>        cout<<m*n<<"\n";
>        for(int i=1;i<=n;i++){
>            for(int j=1;j<=m;j++){
>                cout<<i<<" "<<j<<"\n";
>            }
>        }
>    }
>}
>```
>時間複雜度約為 $O(N×M)$
>~~一樣懶得優化，就是那麼偷懶~~

*--Written By Chen*    
## D.全國系統程式設計大賽
>解題思路:
>我還沒想到
## E.巫醫巫醫拿錢錢
>解題思路:
>該死的假解
## F.買漫畫
>解題思路:
>沒想法
## G.菜月昴與逆序數對
>解題思路:
>離散數學?微積分?你確定?