比赛 |
NOIP_5 |
评测结果 |
AAAAA |
题目名称 |
添加号 |
最终得分 |
100 |
用户昵称 |
BYVoid |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2008-09-24 21:39:35 |
显示代码纯文本
#include <iostream>
#include <string>
#define MAXP 201
#define LIM 1000000000
#define MAXW 9
//1000000000
using namespace std;
class hpnum
{
public:
long sec[MAXP];
int seccnt;
hpnum()
{
sec[seccnt=1]=0;
}
bool bigger(hpnum &b)
{
if (seccnt>b.seccnt)
return true;
if (seccnt<b.seccnt)
return false;
int i;
for (i=seccnt;i>=1;i--)
{
if (sec[i]>b.sec[i])
return true;
if (sec[i]<b.sec[i])
return false;
}
return true;
}
void plus(hpnum &P)
{
int sect=seccnt>P.seccnt?seccnt:P.seccnt;
long T,up=0;
for(int i=1;i<=sect;i++)
{
if (i>seccnt)sec[i]=0;
if (i>P.seccnt)P.sec[i]=0;
T=sec[i]+P.sec[i]+up;
up=T/LIM;
sec[i]=T%LIM;
}
seccnt=sect;
if (up)
sec[++seccnt]=up;
}
void cpy(hpnum &P)
{
seccnt=P.seccnt;
for (int i=1;i<=seccnt;i++)
sec[i]=P.sec[i];
}
void conv(int V)
{
sec[seccnt=1]=0;
int i=1;
while (V)
{
sec[i]=V % LIM;
V-=sec[i];
V/=LIM;
i++;
}
seccnt=i-1;
}
void print()
{
int i,k;
for (i=seccnt;i>=1;i--)
{
k=LIM/10;
if (i!=seccnt && sec[i]<k)
{
while (sec[i]<k)
{
cout << 0;
k/=10;
}
}
if (sec[i])
cout << sec[i];
}
if (sec[1]==0 && seccnt==1)
cout << 0;
}
hpnum* operator=(int a)
{
conv(a);
return this;
}
hpnum* operator=(hpnum a)
{
cpy(a);
return this;
}
};
hpnum operator+(hpnum a,hpnum &b)
{
a.plus(b);
return a;
}
bool operator>(hpnum &a,hpnum &b)
{
return a.bigger(b);
}
typedef hpnum var;
string S;
int K,N;
var num[MAXP][MAXP],F[MAXP][30],INF;
void init()
{
int i,j,k,l;
string T;
freopen("exam4.in","r",stdin);
freopen("exam4.out","w",stdout);
cin >> S >> K;
N=S.length();
K++;
for (i=1;i<=N;i++)
{
for (j=i;j<=N;j++)
{
for (k=j-MAXW,l=1;k>=i;k-=MAXW,l++)
{
T=S.substr(k,MAXW);
sscanf(T.c_str(),"%d",&num[i][j].sec[l]);
}
T=S.substr(i-1,k+MAXW-i+1);
sscanf(T.c_str(),"%d",&num[i][j].sec[l]);
num[i][j].seccnt=l;
/*printf("F[%d][%d] = ",i,j);
num[i][j].print();
cout << endl;*/
}
}
for (i=1;i<MAXP;i++)
INF.sec[i]=9;
INF.seccnt=MAXP;
}
void dynamic()
{
int i,j,k;
var min,p;
for (i=1;i<=N;i++)
F[i][1]=num[1][i];
for (j=2;j<=K;j++)
{
for (i=1;i<=N;i++)
{
if (j>i) continue;
min=INF;
for (k=1;k<=i-1;k++)
{
if (j-1>k) continue;
p=F[k][j-1]+num[k+1][i];
if (min>p)
min=p;
}
F[i][j]=min;
}
}
F[N][K].print();
}
int main()
{
init();
dynamic();
return 0;
}