1. 程式人生 > >演算法-紙牌遊戲

演算法-紙牌遊戲

紙牌遊戲

時間限制:1秒

空間限制:32768K

牛牛和羊羊正在玩一個紙牌遊戲。這個遊戲一共有n張紙牌, 第i張紙牌上寫著數字a_i。
牛牛和羊羊輪流抽牌, 牛牛先抽, 每次抽牌他們可以從紙牌堆中任意選擇一張抽出, 直到紙牌被抽完。
他們的得分等於他們抽到的紙牌數字總和。
現在假設牛牛和羊羊都採用最優策略, 請你計算出遊戲結束後牛牛得分減去羊羊得分等於多少。


輸入描述:
輸入包括兩行。
第一行包括一個正整數n(1 <= n <= 10^5),表示紙牌的數量。
第二行包括n個正整數ai(1 <= a_i <= 10^9),表示每張紙牌上的數字。

輸出描述:
輸出一個整數, 表示遊戲結束後牛牛得分減去羊羊得分等於多少。

輸入例子1:
3
2 7 4

輸出例子1:
5
  • 思路
1. 首先我們可以將他們抽取紙牌的順序抽象成一個數列,由於兩個採取的都是最優的策略,
所以這個數列是一個從大到小排序的有n個元素的數列.
2. 而我們需要求的是牛牛的得分減去羊羊的得分,於是我們可以把上面的數列中代表羊羊的分
數的數倒置為負數,這樣我們實際要求的就是這個數列的前n項和。
比如: 2 7 4 ->(排序) 7 4 2  -> (倒置) -> 7 -4 2 -> (求前n項和) 7 + (-4) + 2 = 5

Note: 由於效率的考慮,排序演算法需要用快速排序,才能AC

  • 演算法複雜度

     演算法的平均複雜度:O(n) = logn + n + n-1 = n ;演算法的最壞情況下的複雜度:O(n) = n^2+ n + n-1 = n^2。

cpp實現

#include<iostream>
using namespace std;
int quick_sort(int arr[], int start,int end) {
    int size = end - start+1;
    if (size <= 1) {
        return -1;
    }
    int left = start;
    int right = end;
    int pivot = left;
    int x = arr[pivot];

    while( left != right ) {
        while
(arr[right] <= x && left < right) { right--; } while(arr[left]>= x && left < right) { left++; } if(arr[left]< arr[right]) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; } } arr[pivot] = arr[right]; arr[right] = x ; quick_sort(arr,start, right-1); quick_sort(arr,right+1,end); return 0; } int shift_symbols(int arr[], int size) { if (size < 1) { return -1; } for (int i = 0; i < size; i++) { if (i % 2 != 0) { arr[i] = -arr[i]; } } return 0; } int sum(int arr[], int size) { int sum = 0; if (size < 1) { return -1; } for (int i = 0; i < size; i++) { sum+= arr[i]; } return sum; } int playing_cards(int cards_num, int card_numbers[]) { if ( cards_num < 1 || cards_num > 100000) { return -1; } //sort the card_nums in asc order, quick sort quick_sort(card_numbers,0, cards_num-1); shift_symbols(card_numbers,cards_num); int s = sum(card_numbers,cards_num); return s; } int main(int argc, char** argv) { int card_num; cin >> card_num; int* card_numbers = (int *)malloc(card_num*sizeof(int)); cin.ignore(); for (int i = 0; i < card_num; i++) { int tmp; cin >> tmp; card_numbers[i] = tmp; } cout << playing_cards(card_num,card_numbers) << endl; }