uva uva 565 - Pizza Anyone?

来源:互联网 发布:小辣椒淘宝店 编辑:程序博客网 时间:2024/06/05 05:29

此题大意:某个人要买一个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
原创粉丝点击