`
plussai
  • 浏览: 90688 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

大数计算模板---zoj_3447

 
阅读更多

        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4190

 

 

        很多DP,贪心会涉及高精度,苦于不会JAVA和PY等,只能找了个大数计算的模板,先膜拜在学习。这个代码请参考:

       http://www.cppblog.com/patriking/archive/2011/01/09/138137.html

       这道题贪心。结果最大的策略就是:不断最小的两个数,计算后放回数集之中;相反的,结果最小的策略就是:不断取出K个(如果不足则取出全部)最大的数,计算后放回数集之中。题目结果很大,需要高精度。

       

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iterator>
#include<string.h>
using namespace std;
const int MAXN = 102;

class bigInt
{ 
public: 
    int num[302], len; 
    bigInt() { num[0] = 0, len = 0; }
    bigInt operator=(const int &a) 
    { 
        int tmp = a; 
        len = 0; 
        while (tmp) 
            num[len++] = tmp % 10, tmp /= 10; 
        if (!len) num[0] = 0, len = 1; 
    }
    bigInt(const int &a) 
    { 
        int tmp = a; 
        len = 0; 
        while (tmp) 
            num[len++] = tmp % 10, tmp /= 10; 
        if (!len) num[0] = 0, len = 1; 
    }
    bool operator<(const bigInt &a) 
    { 
        if (a.len != len) 
            return len < a.len; 
        for (int i = len - 1; i >= 0; i--) 
            if (num[i] != a.num[i]) 
                return num[i] < a.num[i]; 
        return false; 
    } 
    bigInt operator+(const bigInt &a) 
    { 
        bigInt res; 
        int i, j, c = 0, adda, addb; 
        for (i = 0, j = 0; i < len || j < a.len || c; ) 
        { 
            adda = 0, addb = 0; 
            if (i < len) 
                adda = num[i++]; 
            if (j < a.len) 
                addb = a.num[j++]; 
            res.num[res.len++] = (adda + addb + c) % 10; 
            c = (adda + addb + c) / 10; 
        } 
        return res; 
    } 
    bigInt operator-(const bigInt &b) 
    { 
        bigInt res; 
        int i, j, c = 0, suba, subb; 
        for (i = 0, j = 0; i < len || j < b.len || c; ) 
        { 
            suba = 0, subb = 0; 
            if (i < len) 
                suba = num[i++]; 
            if (j < b.len) 
                subb = b.num[j++]; 
            res.num[res.len++] = (suba - subb + c + 10) % 10; 
            c = (suba - subb + c + 10) / 10 - 1; 
        } 
        for (i = res.len - 1; i > 0; i--) 
            if (res.num[i]) break; 
        res.len = i + 1; 
        return res; 
    } 
    bigInt operator*(const bigInt &b) 
    { 
        bigInt res; 
        int i, j, c, now, mulb, tmp; 
        memset(res.num, 0, sizeof(int) * (len + b.len)); 
        for (i = 0; i < len; i++) 
        { 
            now = i, c = 0; 
            for (j = 0; j < b.len || c; ) 
            { 
                mulb = 0; 
                if (j < b.len) 
                    mulb = b.num[j++]; 
                tmp = res.num[now] + num[i] * mulb + c; 
                res.num[now++] = tmp % 10; 
                c = tmp / 10; 
            } 
        } 
        for (i = len + b.len - 1; i > 0; i--) 
            if (res.num[i]) break; 
        res.len = i + 1; 
        return res; 
    } 
    bigInt operator/(const bigInt &b) 
    { 
        bigInt res, diva; 
        int i, j, c; 
        for (i = len - 1; i >= 0; i--) 
        { 
            if (diva.len > 1 || diva.num[0]) 
            { 
                for (j = diva.len - 1; j >= 0; j--) 
                    diva.num[j + 1] = diva.num[j]; 
                diva.len++; 
            } 
            diva.num[0] = num[i]; 
            if (!diva.len) diva.len = 1; 
            res.num[i] = 0; 
            while (!(diva < b)) 
                diva = diva - b, res.num[i]++; 
        } 
        for (i = len - 1; i > 0; i--) 
            if (res.num[i]) break; 
        res.len = i + 1; 
        return res; 
    } 
    bigInt operator%(const bigInt &b) 
    { 
        bigInt res, diva; 
        int i, j, c; 
        for (i = len - 1; i >= 0; i--) 
        { 
            if (diva.len > 1 || diva.num[0]) 
            { 
                for (j = diva.len - 1; j >= 0; j--) 
                    diva.num[j + 1] = diva.num[j]; 
                diva.len++; 
            } 
            diva.num[0] = num[i]; 
            if (!diva.len) diva.len = 1; 
            res.num[i] = 0; 
            while (!(diva < b)) 
                diva = diva - b, res.num[i]++; 
        } 
        for (i = diva.len - 1; i > 0; i--) 
            if (diva.num[i]) break; 
        diva.len = i + 1; 
        return diva; 
    } 
    void display() 
    { 
        int i; 
        for (i = len - 1; i > 1; i--) 
            if (num[i]) break; 
        for (; i >= 0; i--) 
            printf("%d", num[i]); 
        printf("\n");
    } 
}; 

bool cmp(bigInt a, bigInt b)
{
    return (b<a);
}
bool cmp1(bigInt a, bigInt b)
{
    return (a<b);
}

int main()
{
    int x, n, k;
    vector<bigInt>v;
    vector<bigInt>t;
    vector<bigInt>tmp;
    bigInt tmpx;
    freopen("e:\\zoj\\zoj_3447.txt","r",stdin);
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        v.clear();
        t.clear();
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&x);
            bigInt tmp_x = x;
            v.push_back(tmp_x);
        }
        copy(v.begin(),v.end(),back_inserter(t));
        while(v.size()>1)
        {
            tmp.clear();
            sort(v.begin(),v.end(),cmp);
            if(v.size()> k){
                for(int i = k; i < v.size(); i++){
                    tmp.push_back(v[i]);
                }
                tmpx = 1;
                for(int i = 0; i < k; i++){
                    tmpx = tmpx * v[i];
                }
                tmpx = tmpx + 1;
                tmp.push_back(tmpx);
                v.swap(tmp);
            }else{
                tmpx = 1;
                for(int i = 0; i < v.size(); i++)
                    tmpx = tmpx * v[i];
                tmpx = tmpx + 1;
                tmp.push_back(tmpx);
                v.swap(tmp);
            }
        }
        while(t.size()>1)
        {
            tmp.clear();
            sort(t.begin(),t.end(),cmp1);
            if(t.size()>2){
                for(int i = 2; i < t.size(); i++){
                    tmp.push_back(t[i]);
                }
                tmpx = 1;
                for(int i = 0; i < 2; i++){
                    tmpx = tmpx*t[i];
                }
                tmpx = tmpx + 1;
                tmp.push_back(tmpx);
                t.swap(tmp);
            }else{
                tmpx = 1;
                for(int i = 0; i < t.size(); i++)
                    tmpx = tmpx * t[i];
                tmpx = tmpx + 1;
                tmp.push_back(tmpx);
                t.swap(tmp);
            }
        }
        tmpx = t[0]-v[0];
        tmpx.display();
    }
    return 0;
}


 

分享到:
评论

相关推荐

    zoj.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar

    标题中的"ZOJ.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar" 提到了两个ZOJ(Zhejiang Online Judge)的题目,分别是1016和1045,这两个数字通常代表在线编程竞赛中的题目编号。这些题目通常涉及到算法和数据结构的...

    zoj_ac.rar_zoj_zoj 1023_zoj 2792_zoj21_zoj2182

    最近在acm.zju.edu.cn上通过的题目的代码,都是比较有价值的题目

    zoj-cpp.zip_zoj

    【标题】"ZOJ-CPP.zip" 是一个包含ZOJ(在线判题系统ZeroJudge)网站上多个C++编程练习解答的压缩包。这个压缩包的名称表明它专注于C++语言,很可能是一个学习资源,旨在帮助初学者理解和解决动态规划问题。 【描述...

    zoj.rar_ zoj Deck java_oj_zoj_zoj.rar_在线评测

    【标题】"zoj.rar_ zoj Deck java_oj_zoj_zoj.rar_在线评测" 提供的是 ZoJ(Zhejiang Online Judge)在线评测系统的源代码,这是一个用于编程竞赛和教育训练的在线判题平台。"Deck"可能指的是系统中的组件或功能模块...

    ZOJ.zip_Jugs A_ZOJ NTA_zoj acm_zoj acm 1216_zoj code

    【ZOJ.zip】是一个压缩包,里面包含了与ZOJ(Zhejiang Online Judge)相关的ACM(International Collegiate Programming Contest)题解。ZOJ是一个在线编程竞赛平台,它为参赛者提供了一系列算法题目进行练习,以...

    ZOJ1055-Oh_Those_Achin_Feet.rar_BFS最短路径_ZOJ1055_bfs求最短路径_zoj

    标题中的"ZOJ1055-Oh_Those_Achin_Feet.rar"是指ZOJ(Zhejiang Online Judge)平台上的一道编程题目,编号为1055,题目名为"Oh, Those Achin Feet"。这是一道与图论相关的算法问题,主要涉及的是BFS(Breadth First ...

    ZOJ1014.zip_zoj code_zoj1004

    标题“ZOJ1014.zip_zoj code_zoj1004”表明这是一个与ZOJ(ZeroJudge)在线判题系统相关的代码压缩包,其中可能包含了解决ZOJ问题1004的源代码。ZOJ是面向编程爱好者和学生的一个在线编程竞赛平台,它提供了各种算法...

    zoj.rar_zoj_zoj4041

    《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...

    zoj 1002_zoj1002_

    【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...

    acm.tar.gz_zoj_zoj题解_题目分类

    《浙江大学ZOJ源码题解:题目类型与难易度分类》 浙江大学ZOJ(Zhejiang University Online Judge)是一个著名的在线编程竞赛平台,为广大学习计算机科学和技术的同学们提供了丰富的编程题目和实践机会。这个名为...

    zoj.zip_zoj

    【标题】"zoj.zip_zoj"所对应的资源是一个与ZOJ(Zhejiang Online Judge)相关的代码集合。ZOJ是浙江大学主办的一个在线编程竞赛平台,它提供了多种算法题目供用户练习和提交代码进行评测。这个压缩包很可能包含了在...

    zoj1204.rar_acm 1204_zoj1204

    标题中的"zoj1204.rar_acm 1204_zoj1204"指的是浙江大学在线判题系统ZOJ(Zhejiang University Online Judge)上的第1204题,这是一个针对ACM/ICPC(国际大学生程序设计竞赛)训练的问题。在ACM/ICPC中,参赛者需要...

    ZOJ4.16.rar_zoj

    ZOJ4.16.rar_zoj 是一个与ZOJ(Zhejiang Online Judge)相关的压缩文件,这通常意味着它包含了某次程序设计竞赛,特别是2004年4月16日浙江省程序设计竞赛的题目。ZOJ是浙江大学主办的一个在线编程平台,它允许参赛者...

    zoj2536.rar_zoj25

    标题 "zoj2536.rar_zoj25" 暗示这是一份与ZOJ(中国大学在线编程竞赛)第2536号问题相关的提交文件,可能包含了参赛者或教练的代码解决方案。描述中的“这个不是用贪心做的”表明该问题可能涉及到一种非贪心算法的...

    zoj3607.rar_zoj贪心

    【标题】"zoj3607.rar_zoj贪心" 涉及的是ZOJ(Zhejiang Online Judge)在线编程竞赛平台上的一个问题,该问题编号为3607,且与贪心算法相关。这通常意味着我们需要解决一个通过贪心策略可以优化的计算问题。贪心算法...

    zheda.rar_zoj

    浙江大学ZOJ(Zhejiang University Online Judge)是一个在线编程题解平台,专为计算机科学和技术领域的学生、教师以及编程爱好者提供。它包含了丰富的算法题目,是提升编程技能和算法理解的重要资源。"zheda.rar_...

    zoj_1004.cpp BFS版本

    zoj_1004.cpp 求单词字母进出栈后能形成目标串的进出方案 广度优先搜索求解

    zoj1002_1091_1789代码

    能AC 通过的c++代码,包括zoj1002,1091,1789

    zoj1383_zoj1383_

    标题“zoj1383_zoj1383_”和描述中的“一个非常非常非常非常实用的zoj结题代码”暗示我们这可能是一个关于ZOJ(在线判题系统Zhejiang Online Judge)的编程挑战解决方案。ZOJ是一个为编程爱好者提供在线编程练习和...

    ZOJ1007.rar_K.

    标题 "ZOJ1007.rar_K." 指向的是一个编程竞赛题目,ZOJ(Zhejiang Online Judge)是浙江大学的一个在线编程评测系统。这个题目要求参赛者编写程序来计算形如 σ(1/(k(k+x))) 的级数的近似值,其中 k 从 1 开始递增到...

Global site tag (gtag.js) - Google Analytics