您的位置:首页 > 其它

能量晶石

2015-12-24 10:44 309 查看
Jack 正在组装自己的飞行器,他希望从手中的一些很奇怪的能量晶石中,选择一块,作为飞行器引擎的能量来源。
每个晶石,都用一连串的数字进行标注。 可以整块使用,也可以通过对晶石的切割,得到不同强度的能量输出。
切割后,各个晶石片段能量强度之和计算方式为:各个晶石片段上的整数之和。(不可把单个数字切割成 2 半)。
由于飞行器引擎所能承受的能量强度存在上限,切割完的晶石片段,能量强度之和不能超过上限,否则将导致引擎过载。同时,为节省晶石的浪费, Jack 希望一块晶石切下来的所有片段,都必需加入到飞行器引擎中,不能丢弃。
例:晶石“ 352143”,可分割为 35,214,3。它们的能量强度之和为 252。也可分割为
352,143,能量强度和为 495
Jack 希望知道,在不导致引擎过载的同时,手中的这些能量晶石, 各自能够达到的最
接近引擎上限的能量强度是多少。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int func(char sc[],char b[],int flag)
{
int    last=-1,t,r,m,sum=0,len=strlen(sc);
char part[20];
for(t=0;t<len;t++)
{
if(b[t]=='1')
{
r=0;
for(m=last+1;m<=t;m++)
{
part[r++]=sc[m];
}
part[r]='\0';
sum+=atoi(part);
if(flag==1)
printf("%d ",atoi(part));
last=t;
}
}
if(last!=len-1)
{
r=0;
for(m=last+1;m<len;m++)
{
part[r++]=sc[m];
}
part[r]='\0';
sum+=atoi(part);
if(flag==1)
printf("%d\n",atoi(part));
}
return sum;
}
int main()
{
int n,i,j,limit,Q,t,len,sum,a[131072],max=-1,m;
char b[20],num[20],s[20],ans[20];
scanf("%d",&Q);
for(j=0;j<Q;j++)
{
scanf("%s %d",num,&limit);
m=0;
n=strlen(num)-1;
max=-1;
for(i=0;i<int(pow(2,n));i++)//生成所有切割方案
{
itoa(i,b,2);
if(strlen(b)<n)
{
len=strlen(b);
for(t=0;t<n-len;t++)
s[t]='0';
s[t]='\0';
strcat(s,b);
strcpy(b,s);
}
sum=func(num,b,0);
if(sum<=limit&&sum>=max)
{
a[m++]=sum;
max=sum;
strcpy(ans,b);
}
}
if(m>0) sort(a,a+m);//若有多种方案,能量和均能达到最接近引擎上限
if(m==0)
{
printf("Error\n");
}
else if(a[m-1]==a[m-2]&&m>1)
{
printf("Oooops\n");
}
else
{
sum=func(num,ans,1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: