搜索——codevs1185 幸运数字

来源:互联网 发布:联通网络解锁助手2017 编辑:程序博客网 时间:2024/06/08 05:36

http://codevs.cn/problem/1185/
我们的模拟考,我靠;
钻石题,无题解;
我自然是没什么能耐,zzh大佬自然是秒了;
首先,我们达标找规律,发现一个结论;
n<=2000时答案个数不超过9个
在20以后就一定有解;
这个结论太好了;
然而其实也是对的;
至于证明,这个联系到关于博弈论的知识,我不是很会;
虽然我们知道最多只有9个数;
但是直接搜索9个数也是很难的;
因为一个数的范围太大了,我们要缩小;
那我们按位搜索
比如
一个数分解成
4+44+74+474
百位就是4
十位就是4+7+7
个位就是4+4+4+4
我们先1~9枚举会分解成几个数
我们再从n的最高位位开始枚举当前的位的数是什么(可以是0)
每位数最多9*7=63,我们可以方便理解为100;
如果枚举到0位,并且刚好n被分解,更新答案;

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define Ll long longusing namespace std;int e[20][120],q[100],x[12],y[12],d[12],w[12],v[12][12];int n,ii,o;void calc(){    memset(v,0,sizeof v);    for(int i=o;i;i--)        for(int k=0;k<=w[i];k++)            if(4*k+7*(w[i]-k)==d[i]){                for(int j=1;j<=w[i]-k;j++)v[i][j]=7;                for(int j=1;j<=k;j++)v[i][j+w[i]-k]=4;                break;            }    for(int i=ii;i;i--){        int k=0;        for(int j=o;j;j--)k=k*10+v[j][i];        y[ii-i+1]=k;    }    for(int i=1;i<=ii;i++)        if(y[i]<x[i]){            for(int i=1;i<=ii;i++)x[i]=y[i];            return;        }else if(y[i]>x[i])return;}bool dfs(int x,int y,int z,int now){//当前枚举到第x位,总共分成y个数,这一位值因为z,now自己看     if(!x)if(!z)return calc(),1;else return 0;    bool ans=0;    for(int i=now;i<=y;i++)        for(int j=1;j<=e[i][0];j++)            if((z>=e[i][j])&&(((z-e[i][j])*10+q[x-1])/7<=y)){                d[x]=e[i][j];w[x]=i;                ans=ans|dfs(x-1,y,((z-e[i][j])*10+q[x-1]),i);            }    return ans;}bool check(int x,int y){    for(int k=0;k<=y;k++)        if(4*k+7*(y-k)==x)return 1;    return 0;}int main(){    freopen("lucky.in","r",stdin);    freopen("lucky.out","w",stdout);    e[0][0]=1;    for(int i=1;i<=100;i++)        for(int j=1;j<=12;j++)            if(check(i,j))                e[j][++e[j][0]]=i;//e表示用i个47可以组成的数     scanf("%d",&n);    if((n==1)||(n==2)||(n==3)||(n==5)||(n==6)||(n==9)||(n==10)||(n==13)||(n==17)){printf("No solution");return 0;}      for(;n;n/=10)q[++o]=n%10;    for(ii=1;ii<=12;ii++){//ii是全局变量         x[1]=1e9;        if(dfs(o,ii,q[o],0))break;    }    for(int i=1;i<=ii;i++)printf("%d ",x[i]);}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人工喂养大便次数少怎么办 4个月宝宝肠炎怎么办? 三个月的宝宝拉肚子有奶瓣怎么办 吃米粉后不拉屎怎么办 宝宝拉绿色稀水怎么办 3个月宝宝肠胃炎怎么办 两个月婴儿拉水怎么办 3个月宝宝拉绿水怎么办 宝宝拉绿色的水怎么办 宝宝大便绿又水怎么办 8个月婴儿便秘怎么办 2个月婴儿便秘怎么办 四个月宝宝拉稀带有泡沫怎么办 六个月宝宝拉肚子怎么办拉水 婴儿拉的是沫怎么办 婴儿拉泡沫屎是怎么办 宝宝吃奶粉上火大便干燥怎么办 没满月的宝宝拉肚子怎么办 婴儿吃奶粉上火不大便怎么办 四个月宝宝拉沫怎么办 4个月小孩拉肚子怎么办 3个月的宝宝拉稀怎么办 宝宝没喝过奶粉怎么办 宝宝喝冰酸奶咳嗽了怎么办 7个月不爱喝奶怎么办 宝宝不认妈妈该怎么办 九个月宝宝不喝牛奶怎么办 吃羊肉和西瓜后怎么办 娃儿感冒了很咳怎么办 5岁娃儿经常感冒发烧怎么办 娃儿冷得发抖感冒怎么办 吃羊肉和茶后怎么办 宝宝胆汁酸高22怎么办 5个月发烧38度怎么办 28个月宝宝不愿把尿怎么办 16个月宝宝咳嗽怎么办 宝宝晚上不用纸尿裤要尿床怎么办 宝宝头型睡偏了怎么办 初生婴儿鼻子被奶块堵住怎么办 月经排的不顺畅怎么办 四个月的小孩拉肚子怎么办