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;
}
posted @ 2012-10-28 22:54  moonbay  阅读(152)  评论(0编辑  收藏  举报