加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

UVa 690 - Pipeline Scheduling(回溯剪枝)

发布时间:2020-12-13 22:17:16 所属栏目:百科 来源:网络整理
导读:首先对枚举所有可能的时间间隔,然后暴力每个工作之后间隔多久进行下一个,当当前时间加上最短间隔乘剩余个数大于最优解时回溯。 #include cstdio #include cstring #include algorithm using namespace std ; const int maxn = 25 ; int n,a[ 5 ],dt[maxn],

首先对枚举所有可能的时间间隔,然后暴力每个工作之后间隔多久进行下一个,当当前时间加上最短间隔乘剩余个数大于最优解时回溯。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 25;
int n,a[5],dt[maxn],ans,cnt;

bool ok(int *p,int k) {
    for(int i = 0; i < 5; ++i)
        if(a[i] &(p[i] >> k)) return false;
    return true;
}

void dfs(int *p,int d,int sum) {
    if(sum + dt[0] * (10 - d) >= ans) return;
    if(d == 10) {ans = min(ans,sum); return; }
    for(int i = 0; i < cnt; ++i) {
        if(ok(p,dt[i])) {
            int p2[5];
            for(int j = 0; j < 5; ++j)
                p2[j] =(p[j] >> dt[i]) | a[j];
            dfs(p2,d+1,sum + dt[i]);
        }
    }
    return;
}

int main() {
    while(~scanf("%d",&n) && n) {
        memset(a,0,sizeof(a));
        memset(dt,sizeof(dt));
        for(int i = 0; i < 5; ++i) {
            char s[maxn]; scanf("%s",s);
            for(int j = 0; j < n; ++j)
                if(s[j] == 'X') a[i] |=(1 << j);
        }
        cnt = 0;
        for(int i = 1; i <= n; ++i)
            if(ok(a,i)) dt[cnt++]=i;
        ans = 10 * n;
        dfs(a,1,n);
        printf("%dn",ans);
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读