10.21 打卡搜索。

来源:互联网 发布:淘宝运营助理工作总结 编辑:程序博客网 时间:2024/05/21 11:37

近期任务就是敲好暴力,调整状态。。。。
没有其他。
当然需要别的练练手,不然废了。

最近感觉自己把什么题都当模拟了。。。。。
上来就模拟。。。。。。。
从下午开始记得数吧、、

第一道:

poj 1416

切碎。数字段。
主要是要判断的调节比较细碎。。。。。看不懂提啊!

每次枚举合法的可以站在一起的数字。进行dfs。还是不行啊。。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;//by mars_chchar s[15];int target,num,len;int ans[15],v[15];int res,cnt; bool flag=false;void dfs(int x,int y,int z){    if(x == len)   //统计     {        if(res<z)        {            res=z;            num=y;            for(int i=0;i<y;i++)            {                ans[i]=v[i];            }            cnt=1;            if(flag) flag=true;        }        else if(res == z)        {            cnt++;        }    }    int sum=0;    for(int i=x;i<len;i++)    {        sum=sum*10+s[i]-'0';        if(sum+z<=target)        {            v[y]=sum;            dfs(i+1,y+1,sum+z);        }        else break;    } } int main(){    while(scanf("%d%s",&target,s) && target!=0 && s[0]!=0)    {        len=strlen(s);        cnt=0,res=0,num=0;        flag=false;        int p=0,sum=0;        while(p<len)        {            sum=sum*10+s[p]-'0';            p++;        }        if(sum == target)        {            printf("%d %d\n",target,target);            continue;        }        dfs(0,0,0);        if(flag||(res == 0 && target!=0)|| res>target) printf("error\n");        else        {            if(cnt>1) printf("rejected\n");            else            {                printf("%d ",res);                 for(int i=0;i<num;i++)                {                    if(i != num-1) printf("%d ",ans[i]);                     else printf("%d\n",ans[i]);                }             }        }    }    return 0;}

第二道:
poj 1129
挺简单的一道搜索。。。。但是我竟然很想模拟。或者贪心【这个是错的】。

但是时间复杂度有点说不清。。。

所以 我们枚举当前用k个颜色染点能否ok,不ok就颜色num++。。

问题还是在于 dfs的递归不是很好?

WA了1次是输出没有加句号。。。。。打死我吧。。。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;//by mars_chint n,ans;struct data{    int f,t,w,nxt;}e[10005];int first[10005],tot,col[10005];bool flag=false;void add(int a,int b){    e[tot].f=a;    e[tot].t=b;    e[tot].nxt=first[a];    first[a]=tot++;}bool judge(int x,int c){    for(int i=first[x];i!=-1;i=e[i].nxt)    {        if(col[e[i].t] == c)        {            return false;        }    }    return true;}void dfs(int x,int num){    if(flag) return;    if(x>=n)    {        flag=true;        return;    }    for(int i=1;i<=num;i++)    {        if(judge(x,i))        {            col[x]=i;                                         dfs(x+1,num);            //col[x]=0;        }    }    if(!flag)    {        ans++;        dfs(x,num+1);    }}int main(){    while(scanf("%d",&n) && n!=0)    {        scanf("\n");        memset(first,-1,sizeof(first));        memset(col,0,sizeof(col));        for(int i=1;i<=n;i++)        {            char c;            scanf("%c:",&c);            int a=c-'A';            while(scanf("%c",&c) && c!='\n')            {                int b=c-'A';                add(a,b);            }            scanf("\n");        }        ans=1;        flag=false;        dfs(0,1);        if(ans == 1) printf("%d channel needed.\n",ans);        else printf("%d channels needed.\n",ans);    }    return 0;}
0 0
原创粉丝点击