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;
}
发表评论
-
struct数据对齐与#pragma pack(n)
2011-09-14 16:38 1131对struct数据对齐与#pragma pac ... -
位图bitmap
2011-07-13 21:08 948bitmap是一种广泛使用的数据结构,主要用在 ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2886zoj_2243笛卡 ... -
中缀表达式的转化---zoj_2483,zoj_3025
2011-07-04 18:54 1182在我们的日常生活中,中缀表达式是最常用的计算表达方式 ... -
STL---priority_queue zoj_2212,zoj_2724,zoj_3230
2011-06-28 17:50 1294priority_queue顾名思意是优先 ... -
STL---sort
2011-06-25 16:39 829引用:http://blog.csdn.net/rattl ... -
float,double范围和精度
2011-06-23 15:55 1484今天遇到一题zoj_1128,数据范围是(0 ... -
STL map的使用---zoj_2832,zoj_1899,zoj_3023
2011-06-10 15:40 1151map是一类关联式容器。它的特点是增加和删除节 ... -
C++字符串输入操作
2011-06-10 15:34 3937问题1:输入为一行字符串被中间被一些空格隔开 ... -
C++带默认形参的函数
2011-05-22 22:46 2013先上代码: int sub(int x=8,int y=3 ... -
百度面试归~~我还是太年轻了。。。。
2011-05-10 16:24 1343一大早还没怎么睡醒就打了辆车去酒店面试,到了9点,我被带 ... -
const与指针
2011-05-06 20:54 742const 使用情况分类详析 const 用于指针的两种 ... -
指针,数组,sizeof
2011-05-06 17:02 873最近要百度面试,压力有点大。。。复习一下 已知 char *s ... -
c++创建对象,堆,栈。。。
2010-10-22 16:47 1364今天写作业 ,想通过写一个函数createLine来创建一条直 ... -
struct内存分配
2010-10-11 21:14 1268百度的笔试题 struct s1 { char ch, ... -
java,C++栈和堆
2010-09-30 19:04 1337额,看惯了java,最近看c++就是蛋疼。。。写 ...
相关推荐
标题中的"ZOJ.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar" 提到了两个ZOJ(Zhejiang Online Judge)的题目,分别是1016和1045,这两个数字通常代表在线编程竞赛中的题目编号。这些题目通常涉及到算法和数据结构的...
最近在acm.zju.edu.cn上通过的题目的代码,都是比较有价值的题目
【标题】"ZOJ-CPP.zip" 是一个包含ZOJ(在线判题系统ZeroJudge)网站上多个C++编程练习解答的压缩包。这个压缩包的名称表明它专注于C++语言,很可能是一个学习资源,旨在帮助初学者理解和解决动态规划问题。 【描述...
【标题】"zoj.rar_ zoj Deck java_oj_zoj_zoj.rar_在线评测" 提供的是 ZoJ(Zhejiang Online Judge)在线评测系统的源代码,这是一个用于编程竞赛和教育训练的在线判题平台。"Deck"可能指的是系统中的组件或功能模块...
【ZOJ.zip】是一个压缩包,里面包含了与ZOJ(Zhejiang Online Judge)相关的ACM(International Collegiate Programming Contest)题解。ZOJ是一个在线编程竞赛平台,它为参赛者提供了一系列算法题目进行练习,以...
标题中的"ZOJ1055-Oh_Those_Achin_Feet.rar"是指ZOJ(Zhejiang Online Judge)平台上的一道编程题目,编号为1055,题目名为"Oh, Those Achin Feet"。这是一道与图论相关的算法问题,主要涉及的是BFS(Breadth First ...
标题“ZOJ1014.zip_zoj code_zoj1004”表明这是一个与ZOJ(ZeroJudge)在线判题系统相关的代码压缩包,其中可能包含了解决ZOJ问题1004的源代码。ZOJ是面向编程爱好者和学生的一个在线编程竞赛平台,它提供了各种算法...
《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...
【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...
《浙江大学ZOJ源码题解:题目类型与难易度分类》 浙江大学ZOJ(Zhejiang University Online Judge)是一个著名的在线编程竞赛平台,为广大学习计算机科学和技术的同学们提供了丰富的编程题目和实践机会。这个名为...
【标题】"zoj.zip_zoj"所对应的资源是一个与ZOJ(Zhejiang Online Judge)相关的代码集合。ZOJ是浙江大学主办的一个在线编程竞赛平台,它提供了多种算法题目供用户练习和提交代码进行评测。这个压缩包很可能包含了在...
标题中的"zoj1204.rar_acm 1204_zoj1204"指的是浙江大学在线判题系统ZOJ(Zhejiang University Online Judge)上的第1204题,这是一个针对ACM/ICPC(国际大学生程序设计竞赛)训练的问题。在ACM/ICPC中,参赛者需要...
ZOJ4.16.rar_zoj 是一个与ZOJ(Zhejiang Online Judge)相关的压缩文件,这通常意味着它包含了某次程序设计竞赛,特别是2004年4月16日浙江省程序设计竞赛的题目。ZOJ是浙江大学主办的一个在线编程平台,它允许参赛者...
标题 "zoj2536.rar_zoj25" 暗示这是一份与ZOJ(中国大学在线编程竞赛)第2536号问题相关的提交文件,可能包含了参赛者或教练的代码解决方案。描述中的“这个不是用贪心做的”表明该问题可能涉及到一种非贪心算法的...
【标题】"zoj3607.rar_zoj贪心" 涉及的是ZOJ(Zhejiang Online Judge)在线编程竞赛平台上的一个问题,该问题编号为3607,且与贪心算法相关。这通常意味着我们需要解决一个通过贪心策略可以优化的计算问题。贪心算法...
浙江大学ZOJ(Zhejiang University Online Judge)是一个在线编程题解平台,专为计算机科学和技术领域的学生、教师以及编程爱好者提供。它包含了丰富的算法题目,是提升编程技能和算法理解的重要资源。"zheda.rar_...
zoj_1004.cpp 求单词字母进出栈后能形成目标串的进出方案 广度优先搜索求解
能AC 通过的c++代码,包括zoj1002,1091,1789
标题“zoj1383_zoj1383_”和描述中的“一个非常非常非常非常实用的zoj结题代码”暗示我们这可能是一个关于ZOJ(在线判题系统Zhejiang Online Judge)的编程挑战解决方案。ZOJ是一个为编程爱好者提供在线编程练习和...
标题 "ZOJ1007.rar_K." 指向的是一个编程竞赛题目,ZOJ(Zhejiang Online Judge)是浙江大学的一个在线编程评测系统。这个题目要求参赛者编写程序来计算形如 σ(1/(k(k+x))) 的级数的近似值,其中 k 从 1 开始递增到...