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;
    }
  • 相关阅读:
    Akka源码分析-Akka Typed
    Akka源码分析-Persistence Query
    5位ID生成方案
    Akka源码分析-Akka-Streams-GraphStage
    akka监控框架设计
    Akka源码分析-Akka-Streams-Materializer(1)
    day30-2FileWriter用数组进行复制文件
    day30-1FileInputStream不用数组进行复制文件
    day30-1FileInputStream用数组进行复制文件
    day29-2在d盘创建文件夹aaa 里面有aaa.txt bbb.txt ddd.txt
  • 原文地址:https://www.cnblogs.com/moonbay/p/2744074.html
Copyright © 2011-2022 走看看