zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    纯css3实现旋转的太极图
    webstorm9.3 安装less 编译css教程
    javascript之查找数组中最小/最大的数
    javascript基础之打印乘法表
    javascript之查找数组元素
    jvascript 顺序查找和二分查找法
    Vue基础知识之常用属性和事件修饰符(二)
    Vue源码(一)
    BFC以及margin的深入探究
    jQuery中Ajax参数详细介绍
  • 原文地址:https://www.cnblogs.com/moonbay/p/2744074.html
Copyright © 2011-2022 走看看