演算法-紙牌遊戲
阿新 • • 發佈:2019-01-28
紙牌遊戲
時間限制: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;
}