---
# System prepended metadata

title: DDJ 出題教學

---

我這只是解決可能會遇到的問題，詳細內容請看 $chrislai$ 大電神的 [DDJ 出題教學](https://hackmd.io/@chrislaiisme/DDJ_make_problems#DDJ-%E5%87%BA%E9%A1%8C%E6%95%99%E5%AD%B8)。

# 新增題目
## 第一步
登入帳號，然後該帳號要過 $14％$ ，沒有的可以關掉這分頁了。

## 第二步
1. 點擊 `我要加題目` 。
![image](https://hackmd.io/_uploads/SkJBkgtPJl.png)

2. 看完說明後點擊 `成為出題者` 。
![image](https://hackmd.io/_uploads/rkspklYPJx.png)
你會得到這。
![image](https://hackmd.io/_uploads/rk-K-lYD1x.png)

3. 點擊 `題目管理` 。
![image](https://hackmd.io/_uploads/SyyAWxKDke.png)

## 第三步
進到裡面後點擊`新增題目` 。
![image](https://hackmd.io/_uploads/SkWjfxtvkx.png)
啊他旁邊的 `匯入題目` 我也不知道是什麼，如果你好奇的話不要問我。

## 第四步
### 左半邊
1. `題目標題` : 打標題。

2. `內容` : 打題敘。

3. `輸入說明/輸出說明` : 對你的輸入/輸出進行說明，有些人這裡會放他的變數大小，我不喜歡，所以建議放在下面 `提示` 的地方。

4. `範例輸入/範例輸出` 對你的輸入/輸出進行舉例，若是考題(像是程設班期中考、期末考。)我個人是建議做兩個範例，畢竟這樣可以對該題有更多的操作空間，當然沒有說必要，如果你懶得打也可以不要打。

5. `提示` : 這裡我是放變數大小和範例解釋，畢竟要考慮有人會看不懂你的題目到底在說什麼，有時候解其他人的題根本看不懂他在說什麼，應該不是我的問題吧。

6. `參考解法` : 要先選定你的程式語言，和解題時一樣。再來就是把你的 **<font color="#00FF00">AC</font>** code 丟上去，所有帳號都不會看到除了你的帳號。

7. `備註` : 和 `參考解法` 一樣，所有帳號都不會看到除了你的帳號，所以如果你有什麼東西要給解題者看的不要打在這，沒有人看的到。

8. `儲存題目內容` : **<font color="#FF0000">很重要 !!! 很重要 !!!  很重要 !!! </font>** <font color="#FF0000">請記住一件事，DDJ在長時間未進行任何動作會自動登出，但是要等到重整才會發現。換言之，如果你內容打到一半去做其他事並且沒有進行保存，之後又回來繼續打，等到你按下那綠色按鈕後跳出登入畫面你就會開始開始祈禱有儲存成功，然後打開題目時你就會看到乾乾淨淨的題目了，不要問我怎麼知道，都是血和淚的教訓啊。</font>

細說變數的部分。

$tree$ 大電神曾說過 : 「變數範圍不要亂設，這題一看就是會爆。」

是的當初我因為亂設變數被念了一下，所以變數的最大最小你要保證都是可以執行的了的。

![image](https://hackmd.io/_uploads/BJKbe4FDJl.png)
![image](https://hackmd.io/_uploads/r1vrgNKv1e.png)
![image](https://hackmd.io/_uploads/ry1FgNFPke.png)
![image](https://hackmd.io/_uploads/Sy5axEtwkl.png)

### 右半邊
#### 第一部分
![image](https://hackmd.io/_uploads/BJmqcNKv1x.png)

1. 在題目外面也可以看到，像是這樣:
![image](https://hackmd.io/_uploads/SyIQ9EFvye.png)

`虛線` : 選擇題目的狀態，分別為隱藏、練習、公開。(啊我說虛線是因為我拿新題來舉例。) 

`Waiting` : 看你 `參考解法` 的 **<font color="#00FF00">AC</font>** code 能不能通過你的測資。

`齒輪` : 是呼叫你現在看到的這張圖片。

`紙筆` : 是呼叫左右半邊東西。

`</>` : 是看你 `參考解法` 的 **<font color="#00FF00">AC</font>** code  。

`旋轉箭頭` : 重判通過測驗的程式碼，

`向下箭頭` : 下載題目，我也不知道要幹嘛，可能你可以把你的題丟到 `zerojudge` 吧。

`平行箭頭` : 我也不知道他是幹嘛的，反正我按完他給我 同步成功 四個字。

`好多齒輪` : 我也不知道他是幹嘛的，反正我按完他給我 重新計算完畢 六個字。

`垃圾桶` : 放棄題目，啊按完會怎樣我也不知道，每題都是我的心血按不下去。

2. 分類題目，<font color="#FF0000">不要亂放 </font> ，第一點是我看了真的很躁，第二點是學長有說 `校內競賽試題` 和 `DDJ競賽題目` 不能亂丟，我也不知道為什麼。

3. 基本上是不用改的，直接選 `寛鬆比對` 就好了，除非你考的像是畫圖，這種有機會被偷吃步的才會需要用到 `嚴格比對` ，啊 `自訂比對` 都是要自己寫 judge 程式，那是大電神的領域，我不會，如果你有興趣可以去看 $chrislai$ 大電神的 [DDJ 出題教學](https://hackmd.io/@chrislaiisme/DDJ_make_problems#DDJ-%E5%87%BA%E9%A1%8C%E6%95%99%E5%AD%B8)。

4. 就像是上面講的，沒什麼需要補充。

5. 正常人是碰不到這個的，除非你 ~~看Python非常不爽~~ 因為題目需要卡 $Python$，可以放 $16MBytes$ 。

6. 標籤就是方便別人知道你這題是要考什麼東西，說到這我也看他非常不爽，好多類似的東西都是分開來的，秦始皇都統一度量衡多久了，他還是那麼亂，所以請你放標籤時看看前人是怎麼放的然後用的跟他們一樣。

7. 就像是上面講的，沒什麼需要補充。

然後記得儲存。

#### 第二部分
![image](https://hackmd.io/_uploads/HJNxlSFD1e.png)
<font color="#FF0000">請注意，不要改這裡的檔名 !!! 不要改這裡的檔名 !!! 不要改這裡的檔名 !!! </font>，你會受到神秘力量干擾然後一直跟你說 測資上傳失敗!!! 。
然後你會得到這個酷東西:
![image](https://hackmd.io/_uploads/rJokWSYPke.png)

1. 就是叫你要符合他的檔名，以這來舉例就像是 b176_00.in, b176_00.out, b176_01.in, b176_01.out, b176_02.in, b176_02.out...... 我也不知道他為什麼要放 # 然後什麼都不說。

2. 就像是上面講的，沒什麼需要補充，我上面的例子也符合這規則。

3. 就是說一個 .in 檔必須有一另一個 .out 檔，不能單獨任一上傳。

然後 .in 檔就是你測資的輸入檔，.out 檔就是你測資的輸出檔。

#### 第三部分
![image](https://hackmd.io/_uploads/ryRmQHKP1e.png)

基本上不用進行什麼動作，反正就是不要亂調，然後記得儲存。

啊關於秒數的部分，$tree$ 大電神曾說過 : 「可以放的最短時間就是你 code 的時間 $+~0.5$ 秒，不要什麼都放 $0.1$ 秒，你又不是要卡 $py$。」

是的當初我因為亂調時間又被念了一下，所以時間請依照 $tree$ 大電神的說法。

當然你也可以看$chrislai$ 大電神的 [DDJ 出題教學](https://hackmd.io/@chrislaiisme/DDJ_make_problems#DDJ-%E5%87%BA%E9%A1%8C%E6%95%99%E5%AD%B8)，裡面有詳細的解釋。

#### 第四部份
![image](https://hackmd.io/_uploads/HJU3mHFv1x.png)

我不會，另謀高就吧，放著不會怎樣的。
再說一次 $chrislai$ 大電神的 [DDJ 出題教學](https://hackmd.io/@chrislaiisme/DDJ_make_problems#DDJ-%E5%87%BA%E9%A1%8C%E6%95%99%E5%AD%B8)。

# 打測資
分兩種，手打跟程式生。

## 手打
首先打開文件檔，依照你的格式輸出測資，記得檔名要符合規則，然後上傳，結束。

## 程式生
主軸就是生出隨機數，然後符合你的格式。

<font color="#FF0000">記得路徑很重要，你當初的程式碼放在哪裡，你的文字檔就會出現在哪，所以請把你的code放在資料夾裡，除非你想得到一個亂爆的桌面。</font>

我已知的有三種方法，但我只會一種，想學更多的都知道我要說什麼了吧。
這裡有 $chrislai$ 大電神的 [DDJ 出題教學](https://hackmd.io/@chrislaiisme/DDJ_make_problems#DDJ-%E5%87%BA%E9%A1%8C%E6%95%99%E5%AD%B8)。

那我就先講我會的方法。
以[b175: 到大安森林公園跳哥薩克舞](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b175)來舉例。
### 第一步
會需要引入標頭檔。
```cpp=
#include <random>
#include <fstream>
```
我不用萬用標頭檔，所以我的標頭檔長這樣並且在持續生長。
![image](https://hackmd.io/_uploads/HyvWPSFvkl.png)
真好看。

### 第二步
在 `main` 裡打這東西。
```cpp=
int main() {
    srand(time(0)) ;
    mt19937 mt(rand()) ;
    
    return 0 ;
}
```
什麼 ? 你問我為什麼 ? 我只能告訴你他是生成隨機數的東西，想知道更多 ?
這裡有 $chrislai$ 大電神的 [DDJ 出題教學](https://hackmd.io/@chrislaiisme/DDJ_make_problems#DDJ-%E5%87%BA%E9%A1%8C%E6%95%99%E5%AD%B8)。

### 第三步
宣告變數和他的大小範圍。
```cpp=
int main() {
    srand(time(0)) ;
    mt19937 mt(rand()) ;
    
    uniform_int_distribution<int> m(1,1000);
    uniform_int_distribution<int> n(0,1);
    uniform_int_distribution<int> p(1,10000);
    uniform_int_distribution<int> q(1,10000);
    //有多少個需要用到就呼叫多少個。
    
    return 0 ;
}
```

### 第四步
建立儲存的文字檔，引號中的是名字，後面的是你的這個檔案是要在這程式是被當作輸出的位置還是輸出的位置，當作輸出是`out`，當作輸入是`in`。
```cpp=
int main() {
    srand(time(0)) ;
    mt19937 mt(rand()) ;
    
    uniform_int_distribution<int> m(1,1000);
    uniform_int_distribution<int> n(0,1);
    uniform_int_distribution<int> p(1,10000);
    uniform_int_distribution<int> q(1,10000);
    
    fstream infile("b175_00.in", ios::out);
    
    outfile.close();
    return 0 ;
}
```

### 第五步之一
按照該題的格式進行。
```cpp=
int main() {
    srand(time(0)) ;
    mt19937 mt(rand()) ;
    
    uniform_int_distribution<int> m(1,1000);
    uniform_int_distribution<int> n(0,1);
    uniform_int_distribution<int> p(1,10000);
    uniform_int_distribution<int> q(1,10000);
    
    fstream infile("b175_00.in", ios::out);
    
    int mm = m(mt) ;
    
    infile << mm << " " << p(mt) << endl;
    
    while(mm--){
        infile << n(mt) << " " << q(mt) << endl;
    }
    
    outfile.close();
    return 0 ;
}
```

會把這放出來的重點在變數後面的 `(mt)` ，很重要，反正就是格式要求。

那麼第12行是在做什麼 ?
其實就是把生成的東西存到另一個變數裡，因為我第16行要用到他的值，要固定他，如果我是照著下面的方式就會出錯，因為他的變數的值不一樣了。
```cpp=
int main() {
    srand(time(0)) ;
    mt19937 mt(rand()) ;
    
    uniform_int_distribution<int> m(1,1000);
    uniform_int_distribution<int> n(0,1);
    uniform_int_distribution<int> p(1,10000);
    uniform_int_distribution<int> q(1,10000);
    
    fstream infile("b175_00.in", ios::out);
    
    infile << m(mt) << " " << p(mt) << endl;
    
    while(m(mt)--){
        infile << n(mt) << " " << q(mt) << endl;
    }
    
    outfile.close();
    return 0 ;
}
```

### 第五步之二
這裡是做 .out檔的部分。

一樣的呼叫文字檔，我`cin`的部分都叫做`infile`，`cout`的部分都叫做`outfile`。
你的程式碼其他部分都不用改變。
```cpp=
int main() 
    fstream infile("b182_00.in", ios::in);
    fstream outfile("b182_00.out", ios::out);

    int t;
    infile >> t;
    while(t--){
        //該題 AC code 。
        outfile << v[0] << '\n';
    }

    infile.close();
    outfile.close();
    return 0;
}
```

### 第六步
然後慢慢地改檔名執行你會的到這個。
![image](https://hackmd.io/_uploads/r1sviSFPke.png)
然後上傳，結束。

# 補充
沒什麼，只是想打的這段話被放在打測資的裡面我不開心，所以拉一個補充出來，好了進入正題。

如果有錯字或某處的格式和其他地方不一樣請告訴我，要用留言的會是直接傳訊息給我都可以。

啊有還是不了解的地方也可以以同樣方式呼喚(? 我。