比赛 |
20120705 |
评测结果 |
AAAWAAWAWA |
题目名称 |
数字计算 |
最终得分 |
70 |
用户昵称 |
QhelDIV |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-07-05 11:27:14 |
显示代码纯文本
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fin("puzzle.in");
ofstream fout("puzzle.out");
string S;
int T,L;
unsigned long long Nu[30][30],f[30][300],g[30][300];
void Initialize()
{
int i,j;
for(i=1;i<=L;i++)
for(j=i;j<=L;j++)
Nu[i][j]=Nu[i][j-1]*10+S[j]-'0';
for(i=1;i<=L;i++)
for(j=0;j<=T;j++)
{
f[i][j]=1000000000;
g[i][j]=1000000000;
if(Nu[1][i]==j)
f[i][j]=0,g[i][j]=0;
}
for(i=0;i<=T;i++)
f[0][i]=1000000000,g[0][i]=1000000000;
}
void dp()
{
unsigned long i,j,k,l;
for(i=1;i<=L;i++)
for(j=0;j<=T;j++)
{
if(S[i]=='0')
f[i][0]=1;
for(k=0;k<i;k++)
if(Nu[k+1][i]!=0 && (j/Nu[k+1][i])*Nu[k+1][i]==j)
f[i][j]=min(f[i][j],f[k][j/Nu[k+1][i]]+1);
for(k=1;k<i;k++)
for(l=k+1;l<i;l++)
if(j>=Nu[k+1][l]*Nu[l+1][i])
{
f[i][j]=min(f[i][j],g[k][j-Nu[k+1][l]*Nu[l+1][i]]+2);
f[i][j]=min(f[i][j],f[k][j-Nu[k+1][l]*Nu[l+1][i]]+2);
}
for(k=0;k<i;k++)
if(j>=Nu[k+1][i])
{
g[i][j]=min(g[i][j],g[k][j-Nu[k+1][i]]+1);
g[i][j]=min(g[i][j],f[k][j-Nu[k+1][i]]+1);
}
}
if(min(f[L][T],g[L][T])==1000000000)
fout<<-1<<endl;
else
fout<<min(f[L][T],g[L][T])<<endl;
}
void Solve()
{
int i;
fin>>S>>T;
while(T>=0)
{
L=S.length();S.insert(0," ");
Initialize();
dp();
fin>>S>>T;
}
}
int main()
{
Solve();
fin.close();
fout.close();
}