UVA565订披萨,每个人提几个条件,至少满足每个人的一个条件的方案

52 篇文章 0 订阅

这题,虽然简单,但是毕竟本人比较渣,说一下心酸历程,看到这题想了下就去敲代码,各种找bug,AC不了,然后就去参考别人

的代码,发现别人都是用位运算来做的,当然位运算的做法比较巧妙,然后就模仿着写了一发位运算的,然后AC,然后总感觉我一开始的

代码能AC,就继续找最开始的代码的bug,随便除了组样例,竟然阴差阳错的找到了bug,然后迅速的改了就AC了,慢慢的都是心酸,但至少

我的提交在VJ上时间是最短的,这波不亏。找了四个多小时的bug,我也是够了。

先说下我这题的输入写的稍微有些麻烦的,看不下去的可以自己改下输入,下面贴上位运算和dfs俩种方法的代码:

dfs:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<climits>
#include<vector>
#include<cfloat>
#include<queue>
#include<cctype>
#include<cstdlib>
#include<string>
#define LL long long
using namespace std;

int b[20],a[20][20];
int l,flag;
void dfs(int cur)
{
    if(flag)
        return;
    if(cur==l)
    {
         cout<<"Toppings: ";
         for(int i=0;i<20;i++)
            if(b[i]==1)
            printf("%c",'A'+i);
         cout<<endl;
         flag=1;
         return;
    }
    for(int i=0;i<20;i++)
    {
        if(a[cur][i])<span style="white-space:pre">			</span>//就是这里一开始写的简单了,注意前面有和这个一样的要满足的条件的可以直接跳过。
        {
            if(b[i]==a[cur][i])
                dfs(cur+1);
            if(b[i]==0)
            {
                b[i]=a[cur][i];
                dfs(cur+1);
                b[i]=0;
            }
        }
    }
}
int main()
{
    string s;
    while(cin>>s)
    {
        flag=0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        l=0;
        for(int i=1;i<s.length();i++)
        {
            int te=s[i]-'A';
            if(s[i-1]=='+')
                a[l][te]=1;
            if(s[i-1]=='-')
                a[l][te]=-1;
        }
        l++;
        while(cin>>s&&s!=".")
        {
            for(int i=1;i<s.length();i++)
            {
                int te=s[i]-'A';
                if(s[i-1]=='+')
                    a[l][te]=1;
                if(s[i-1]=='-')
                    a[l][te]=-1;
            }
            l++;
        }
        dfs(0);
        if(!flag)
            cout<<"No pizza can satisfy these requests."<<endl;
    }
    return 0;
}

位运算:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<climits>
#include<vector>
#include<cfloat>
#include<queue>
#include<cctype>
#include<cstdlib>
#include<string>
#define LL long long
using namespace std;

int b[20],a[20][20],yes[20],no[20];
int l,flag;
int main()
{
    string s;
    while(cin>>s)
    {
        flag=0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(yes,0,sizeof(yes));
        memset(no,0,sizeof(no));
        l=0;
        for(int i=0;i<(int)s.length()-2;i+=2)
        {
            int te=s[i+1]-'A';
            if(s[i]=='+')
                a[l][te]=1;
            if(s[i]=='-')
                a[l][te]=-1;
        }
        l++;
        if(s!=".")
        {
              while(cin>>s&&s!=".")
              {
                for(int i=0;i<(int)s.length()-2;i+=2)
                {
                    int te=s[i+1]-'A';
                     if(s[i]=='+')
                        a[l][te]=1;
                     if(s[i]=='-')
                        a[l][te]=-1;
                }
                l++;
               }
        }
        for(int i=0;i<l;i++)
        {
            for(int j=0;j<16;j++)
            {
                if(a[i][j]==1)
                    yes[i]|=(1<<j);
                if(a[i][j]==-1)
                    no[i]|=(1<<j);
            }
        }
        flag=0;
        for(int i=0;i<(1<<16);i++)
        {
            int j;
            for(j=0;j<l;j++)
            {
                  if((yes[j]&i)||((~i)&(no[j])))
                  continue;
                  else
                    break;
            }
            if(j==l)
            {
                cout<<"Toppings: ";
               int tem=i;
               int k=0;
              for(int k=0;k<16;k++)
                if(i&(1<<k))
                printf("%c",'A'+k);
               cout<<endl;
                flag=1;
                break;
            }
        }
        if(!flag)
            cout<<"No pizza can satisfy these requests."<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值