uva uva 565 - Pizza Anyone?

此题大意:某个人要买一个pizza和朋友一起吃,每个人都有一些要求,要求是需要满足每个人至少一个要求。


注意点:对于某个人来说,若存在他不想要的但是存在他想要的是可以的,也可以存在没有他想要的,但是他不想要也没得。


这道题我用了4个多小时:

第一次:使用了集合+二进制枚举子集 TLE。

第二次:使用map+二进制枚举子集TLE。

第三次:使用了数组+二进制枚举子集 2.282秒。

第四次:使用了IDA*来dfs , 用时 0.928秒

第五次:加上美剧时的上限,用时 0.692秒


此题缩短时间复杂度的方法 

1.使用数组保存每个要求 不要的东西的个数,使用数组每个要求。

2.使用IDA*。

//
//  main.cpp
//  uva 565 - Pizza Anyone?
//
//  Created by XD on 15/8/7.
//  Copyright (c) 2015年 XD. All rights reserved.
//

#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
using namespace std ;


int n ;
int maxd ;
int visp[20] ;
int vism[20] ;
int t1 ;
int t ;
int con[20] ;
int ans[20] ;
char s[110] ;



int pizza_con[20][2][20]  ;
int pizzaminus[20][1] ;


void initConstraints()
{
    
    int len = (int )strlen(s) ;
    pizzaminus[n][0]= 0 ;
    for (int i = 0 ; i < len-1 ; i++) {
        if (s[i]== '+') {
            pizza_con[n][0][s[++i]-'A'+1] =1;
            visp[s[i]-'A'+1] = 1 ;
        }
        else {
            pizza_con[n][1][s[++i]-'A'+1] =1;
            vism[s[i]-'A'+1] = 1 ;
            pizzaminus[n][0]++ ;
        }
    }
    n++ ;
}

bool satisfy(int x)
{
    for (int i = 0; i < t1; i++) {
        if (pizza_con[x][0][con[i]]==1) {
            return true ;
        }
    }
    int num = 0 ;
    for (int i = 0; i < t1; i++) {
        if (pizza_con[x][1][con[i]]==1) {
            num++;
        }
    }
    
    
    if (pizzaminus[x][0] -num ==  0) {
        return false ;
    }
    return true;
    
}
bool issatisfyEverone()
{
    for (int i = 0; i < n ; i++) {
        if (!satisfy(i)) {
            return false ;
        }
    }
    return true ;
}

int dfs(int d,int start)
{
    if (d == maxd) {
        t1 = d ;
        if (issatisfyEverone()) {
            return 1 ;
        }
        else{
            return 0  ;
        }
    }
    for (int i = start; i <= t - (maxd - d); i++) {
        con[d] = ans[i] ;
        if ( dfs(d+1, i+1))
        {
            return 1 ;
        }
    }
    return 0 ;
    
}

int main() {
    while (scanf(" %s" ,s)==1) {
        memset(visp, 0, sizeof(visp)) ;
        memset(vism, 0,sizeof(vism)) ;
        memset(pizza_con, 0, sizeof(pizza_con)) ;
        n=0 ;
        initConstraints() ;
        while (scanf(" %s" , s)==1 ) {
            if (s[0] == '.') {
                break ;
            }
            else
            {
                initConstraints() ;
            }
        }
        t =0 ;
        for (int i = 1; i  < 17; i++) {
            if(visp[i] || vism[i]  ){
                ans[t++] = i ;
            }
            
        }
        
        int flag = 0 ;
        for (maxd = 0; maxd <=t ; maxd++) {
            if (dfs(0, 0)) {
                printf("Toppings: ") ;
                for (int j = 0 ; j < t1; j++) {
                    printf("%c" , con[j]+'A'-1) ;
                }
                printf("\n") ;
                flag =  1 ;
                break ;
            }
        }
//        int end = (1<<t) ;
        //        for (int i = 0; i < end; i++) {
        //            t1 = 0 ;
        //            for (int j = 0 ; j <t ; j++) {
        //                if (i&(1 << j )) {
        //                    con[t1++] = ans[j] ;
        //                }
        //            }
        //            if(issatisfyEverone())
        //            {
        //                printf("Toppings: ") ;
        //                for (int j = 0 ; j < t1; j++) {
        //                    printf("%c" , con[j]+'A'-1) ;
        //                }
        //                printf("\n") ;
        //                flag =  1 ;
        //                break ;
        //            }
        //        }
        if (!flag) {
            printf("No pizza can satisfy these requests.\n") ;
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值