24h購物| | PChome| 登入
2011-06-10 19:38:35| 人氣703| 回應0 | 上一篇 | 下一篇

d806. 水火不容

推薦 0 收藏 0 轉貼0 訂閱站台

http://zerojudge.tw/ShowProblem?problemid=d806

內容 :

某天淼淼和焱焱決定要用一個遊戲決一死戰,這個遊戲玩法如下:
一開始有n顆石頭,每顆上面都寫著一個數字,兩個人輪流取石頭,
每人每回合可以取任意數量的石頭,而該人該回合的得分即為其取的石頭中數字的最小值
,你知道他們皆絕頂聰明,因而想要寫個程式事先預測他們的勝負來決定要投奔誰。

輸入說明 :

第一行有一個正整數n(n<=1000000),代表石頭的數量
第二行有n個正整數,分別代表每顆石頭上面的數字(<=1000000000)

輸出說明 :

一個整數,代表在雙方皆絕頂聰明的情況下,先手最多可以贏後手幾分

範例輸入 :

3
3 1 1

範例輸出 :

2

提示 :

出處 :

(管理:shik)

作法描述 by (leopan0922)
假設A為先手的分數
B為後手的分數
我們知道每次都有兩種情況
1種是A拿了而答案不變也就是A-B不變
另一種則是B拿了而答案變成輸入的數+B-A
也就是輸入的數-答案
所以我們只需要由小排到大
找到最大的輸入-目前答案
那就是這題的答案了

/**********************************************************************************/
/*  Problem: d806 "水火不容" from                                             */
/*  Language: C                                                                   */
/*  Result: AC (115ms, 2826KB) on ZeroJudge                                       */
/*  Author: morris1028 at 2011-06-02 22:51:48                                     */
/**********************************************************************************/


#include<stdio.h>
struct Axis{
    int t;
}Data[1000000], X[1000000];
void Merge(int l, int m, int h) {
    int In1=l, In2=m+1;
    int a, b, Top=0;
    while(In1<=m && In2<=h)
        if((Data[In1].t < Data[In2].t))
             X[Top++]=Data[In1++];
       else  X[Top++]=Data[In2++];
    while(In1<=m)   X[Top++]=Data[In1++];
    while(In2<=h)   X[Top++]=Data[In2++];
    for(a=0,b=l;a<Top;a++,b++)
        Data[b]=X[a];
}
void MergeSort(int l, int h) {
    if(l < h) {
        int m=(l+h)/2;
        MergeSort(l  ,m);
        MergeSort(m+1,h);
        Merge(l,m,h);
    }
}
int Input() {  
    char cha;  
    unsigned int x = 0;  
    while(cha = getchar())  
        if(cha != ' ' && cha != '\n' || cha == EOF) break;  
    if(cha == EOF) return -1;
    x = cha-48;  
    while(cha = getchar()) {  
        if(cha == ' ' || cha == '\n') break;  
        x = x*10 + cha-48;  
    }
    return x;  
}
main() {
    int N, a;
    while(scanf("%d", &N) == 1) {
        for(a = 0; a < N; a++) Data[a].t = Input();
        MergeSort(0, N-1);
        int max = 0;
        for(a = 0; a < N; a++)
            max = (Data[a].t - max > max) ? Data[a].t - max : max;
        printf("%d\n", max);
    }
    return 0;
}

台長: Morris
人氣(703) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:d831. 畢業旅行
此分類上一篇:d815. 水火不容II

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文