hdu 3818模拟

刚开始看到这题的时候,理解错了数据范围,以为K<100,那就是道高精度水题了,于是用java打了交,runtime error!然后就想出了这么个模拟的方法,直接用一个数组存下fibonacci表示的数,两个数合并在一起以后,就是处理这个数组的问题了,其实也不难,也就是如果存在两个相邻的,如a,a+1,就把它们合并成a+2,还有就是如果有两个a,则分成a-2和a+1。

/*

 * hdu3818cpp/win.cpp

 * Created on: 2012-10-28

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;

const int MAXM = 1000005;

int fibo[MAXM];



void work() {

    bool flag = true;

    while(flag) {

        flag = false;

        for(int i = 1; i < MAXM; i++) {

            if(fibo[i] >= 2) {

                fibo[i] -= 2;

                fibo[i - 2]++;

                fibo[i + 1]++;

                flag = true;

            }

            if(fibo[i] > 0 && fibo[i + 1] > 0) {

                fibo[i]--;

                fibo[i + 1]--;

                fibo[i + 2]++;

                flag = true;

            }

        }

        if(fibo[1] > 0) {

            fibo[2] += fibo[1];

            fibo[1] = 0;

            flag = true;

        }

    }

}



void myprint() {

    int t = 0;

    for(int i = 1; i < MAXM; i++) {

        if(fibo[i] > 0) {

            t++;

        }

    }

    printf("%d", t);

    for(int i = 1; i < MAXM; i++) {

        if(fibo[i] > 0) {

            printf(" %d", i);

        }

    }

    putchar('\n');

}



int main() {

#ifndef ONLINE_JUDGE

    freopen("data.in", "r", stdin);

#endif

    int T, a, b;

    scanf("%d", &T);

    for(int t = 1; t <= T; t++) {

        fill(fibo, fibo + MAXM, 0);

        scanf("%d", &a);

        while(a--) {

            scanf("%d", &b);

            fibo[b]++;

        }

        scanf("%d", &a);

        while(a--) {

            scanf("%d", &b);

            fibo[b]++;

        }

        work();

        printf("Case %d:\n", t);

        myprint();

    }

    return 0;

}

你可能感兴趣的:(HDU)