A.貓貓卡牌
Problem ID: triplet
殿壬是個天才兒童,他在一個月大的時候就學會數數、六個月大的時候就學會乘法跟除法、一歲時學會寫程式、一歲又六個月時養了可愛的拉不拉多、一歲又十個月時養了可愛的貓咪、兩歲時發明了「吃餅乾」的遊戲,現在要講的是殿壬三歲大的故事。
這天,殿壬牽著他的貓貓來到了 NPSC 魔法學院的醉月湖旁邊,和貓貓玩著現在正流行的遊戲 – 貓貓卡牌。
貓貓牌組是由三種類型(金貓、銀貓、呆若木喵)的卡牌所形成的牌組。在一組牌組中,每種類型的卡牌有 n 張,因此一共會有 3 × n 張牌。特別地,每一張牌都會有一個數字寫在上面,類型為金貓的 n 張卡片上寫的數字分別為 a1, a2, . . . , an;類型為銀貓的 n 張卡片上寫的數字分別為 b1, b2, . . . , bn;類型為呆若木喵的 n 張卡片上寫的數字分別為 c1, c2, . . . , cn。
現在,相信你對卡片上所擁有的資訊都了解得差不多了!
接下來,這個遊戲將進行 n 輪,每一輪貓貓會按照如下的步驟選出: 1. 從「剩下」的金貓、銀貓、呆若木喵的卡牌中各選出一張牌,並將這三張牌從牌組中去除。 2. 將這三張牌中的最小數字寫在一張紙上。
最後貓貓將寫在紙上的這 n 個數字加起來,我們稱這個數值為分數。如果這個分數是所有可能中的最小值,那麼貓貓將能獲得一個殿壬的摸摸。
因為貓貓數學不好,但同時又很想獲得殿壬的摸摸,因此現在貓貓給你每種類型貓貓卡牌上所寫的數字,想請你幫他算出可能的最小分數會是多少?
Input
輸入第一行有一個整數 n,代表每種類型的卡片有 n 張。
輸入第二行有 n 個整數 a1, a2, . . . , an,分別代表這 n 張金貓類型的卡牌上面寫的數字是多少。
輸入第三行有 n 個整數 b1, b2, . . . , bn,分別代表這 n 張銀貓類型的卡牌上面寫的數字是多少。
輸入第四行有 n 個整數 c1, c2, . . . , cn,分別代表這 n 張呆若木喵類型的卡牌上面寫的數字是多少。
• 1 ≤ n ≤ 100000
• 1 ≤ ai, bi, ci ≤ 109,對於所有正整數 i ≤ n
Output
輸出一個整數,代表可能的最小分數。
Sample | Input | Output |
1 |
3 1 1 1 2 2 2 3 3 3 |
3 |
2 |
2 1 3 4 2 5 6 |
3 |
3 | 3 1 2 3 1 3 5 3 3 5 |
4 |
題目簡述:經過輸入會得到三堆數字,每次每堆任取一個,共取出三個數,將三數中最小的保留,全部取完後,把每次保留的數加總,請寫出程式算出最後加總最小值是多少。
思考做法:每堆任取一個,希望找出最小的加總,意思就是要所有數的最小三個數,即把全部的數排序,取最小的三個。
排序法:泡沫排序 https://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F
#include <iostream> using namespace std; template<typename T> void bubble_sort(T arr[], int len) { int i, j; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]); } int main(){ int n; cin>>n; int arr[n*3]; for(int i=0;i<n*3;i++){ int a; cin>>a; arr[i]=a; } //秀出排序前的arr //for (int i=0;i<n*3;i++) cout<<arr[i]<<" "; //cout<<endl; //泡沫排序法 bubble_sort(arr, n*3); //秀出排序後的arr //for (int i=0;i<n*3;i++) cout<<arr[i]<<" "; //cout<<endl; cout<<arr[0]+arr[1]+arr[2]<<endl; return 0; }