题意:
给两个数n和m,先要求把m切成几个分片,这几个分片之和为s,求max(s)<=n,若s不唯一,输出rejected,若s不存在,输出error,若s存在唯一,则按从左往右的顺序输出分片
例子:
n=50 m=12346
则s=1+2+34+6=43 并且是唯一的,所以输出43 1 2 34 6
n=12 m=111
则s=1+11=11+1=12 不唯一 输出rejected
若n=m 输出n n
若n=m=0 结束
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <vector> #include <map> #include <queue> #include <set> #include <algorithm> #include <limits> using namespace std; typedef long long LL; int tx,numx,res[10],ans[10],tmp[10]; void getlen(int numx){ res[0]=0; res[1]=0; if(numx==0){ res[0]=1; return ; } while(numx){ res[++res[0]]=numx%10; numx/=10; } } int getnum(int l,int r){ int ans=0; for(int i=r;i>=l;i--){ ans=ans*10+res[i]; } return ans; } int checknum(int x){ tmp[0]=0; int tans=0; int l=0,r=0; while(1){ if(l==res[0])break; r=l+1; while((x&(1<<r))==0)++r; tmp[++tmp[0]]=getnum(l+1,r); tans+=tmp[tmp[0]]; l=r; } return tans; } void solve(){ if(tx==numx){ printf("%d %d\n",numx,numx); return ; } getlen(numx); int tt=(1<<(res[0]-1)); int cnt=0; int tmax=-1; for(int i=0;i<tt;i++){ int k=i; k=(k<<1)|1; k=k|(1<<res[0]); int tans=checknum(k); if(tmax==-1){ if(tans<=tx){ ++cnt; tmax=tans; memcpy(ans,tmp,sizeof(tmp)); } } else if(tans<=tx&&tmax<=tans){ if(tmax==tans)++cnt; else cnt=1; tmax=tans; memcpy(ans,tmp,sizeof(tmp)); } } if(tmax==-1)puts("error"); else if(cnt>1)puts("rejected"); else { printf("%d",tmax); for(int i=ans[0];i>=1;i--){ printf(" %d",ans[i]); } puts(""); } } int main() { while(~scanf("%d%d",&tx,&numx)&&(tx||numx))solve(); return 0; }
|