:::

2-1 A.貓貓卡牌(★★★)

一、題目

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;
}

 

 


搜尋