1. 程式人生 > >UVA 690 Pipeline Scheduling (搜尋+位運算+剪枝)

UVA 690 Pipeline Scheduling (搜尋+位運算+剪枝)

題意:10個任務,5個通道,要求每個通道都能放下10個任務且不衝突,然後每個通道的放的方式間隔都是一樣的,問最短需要時間。

思路:利用位運算儲存每個通道的放置方法,然後去深搜,要加剪枝。詳細見程式碼

程式碼:

#include <stdio.h>
#include <string.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
const int N = 35;
int n, p[5], ans, w[N], wn;
char str[N];

bool judge(int s0, int s1, int s2, int s3, int s4) {
	return ((s0&p[0]) == 0 
		&& (s1&p[1]) == 0 
		&& (s2&p[2]) == 0 
		&& (s3&p[3]) == 0 
		&& (s4&p[4]) == 0);
}

void init() {
	ans = 10 * n; wn = 0;
	for (int i = 0; i < 5; i++) {
		p[i] = 0;
		scanf("%s", str);
		for (int j = n - 1; j >= 0; j--) {
			p[i] = p[i] * 2 + (str[j] == 'X');
		}
	}
	int s0 = p[0], s1 = p[1], s2 = p[2], s3 = p[3], s4 = p[4];
	for (int k = 0; k <= n; k++) {
		if (judge((s0>>k), (s1>>k), (s2>>k), (s3>>k), (s4>>k))) {
			w[wn++] = k;//剪枝,開w陣列把不能放的位置剔除掉
		}
	}
}

void dfs(int s0, int s1, int s2, int s3, int s4, int d, int len) {
	if (len + w[0] * (10 - d) > ans) return;//關鍵剪枝
	if (d == 10) {
		ans = min(ans, len);
		return;
	}
	for (int i = 0; i < wn; i++) {
		int ss0 = (s0>>w[i]), ss1 = (s1>>w[i]), ss2 = (s2>>w[i]), ss3 = (s3>>w[i]), ss4 = (s4>>w[i]);
		if (judge(ss0, ss1, ss2, ss3, ss4)) {
			dfs(ss0^p[0], ss1^p[1], ss2^p[2], ss3^p[3], ss4^p[4], d + 1, len + w[i]);
		}
	}
}

int main() {
	while (~scanf("%d", &n) && n) {
		init();
		dfs(p[0], p[1], p[2], p[3], p[4], 1, n);
		printf("%d\n", ans);
	}
	return 0;
}


相關推薦

UVA 690 Pipeline Scheduling (搜尋+運算+剪枝

題意:10個任務,5個通道,要求每個通道都能放下10個任務且不衝突,然後每個通道的放的方式間隔都是一樣的,問最短需要時間。 思路:利用位運算儲存每個通道的放置方法,然後去深搜,要加剪枝。詳細見程式碼 程式碼: #include <stdio.h> #inc

UVa 690 Pipeline Scheduling

An arithmetic pipeline is designed to process more than one task simultaneously in an overlap- ping manner. It includes function units

[POJ2965]The Pilots Brothers' refrigerator (搜尋/運算)

題意 遊戲“The Pilots Brothers:跟隨有條紋的大象”有一個玩家需要開啟冰箱的任務。 冰箱門上有16個把手。每個手柄可以處於以下兩種狀態之一:開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。手柄表示為矩陣4х4。您可以在任何位置[i,j](1≤i,j≤4)更改控制代碼的狀態。但是,這

計蒜客15430 XOR Queries(Trie處理運算問題

ron 二進制 進制 插入 我們 整數 容易 位置 xor 題意: 給出一個長度為n的數組C,回答m個形式為(L, R, A, B)的詢問, 含義為存在多少個不同的數組下標k屬於[L, R]滿足C[k] XOR A >= B(式中XOR為異或運算)。 T組測試數

1315 合法整數集(運算+模擬

去掉 出現 its eml nbsp out %d 技術分享 aps 1315 合法整數集 題目來源: TopCoder 基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級算法題 收藏 關註 一個整數集合S是合法的,指S的任意子集

【BZOJ3668】[NOI2014] 起床困難綜合症(運算思想

點此看題面 大致題意: 給定一些位運算操作,讓你在\(0\sim m\)範圍內選一個初始值,使其在經過這些運算後得到的結果最大。 前置技能:關於位運算 作為一道位運算的題,如果你不知道什麼是位運算,那就完全做不了了。 關於位運算可以詳見這篇部落格:位運算相關(一)——位運算學習筆記。 接下來,我

Newcoder 18 B.Xor(運算+dp

Description 給定長度為nnn的非負整數序列aaa,問有多少個長度為nnn的非負整數序列bbb, 滿足: bi≤aib_i\le a_ibi​≤ai​ b1xorb2xor...xorbn=a

n皇后(運算

其實我也沒覺得多快233333333 #include <cstdio> #include <iostream> #include <algorithm> #i

快速冪(原理,一般,遞迴,運算演算法

  因為一開始對位運算不是很明白,加上2進位制權值忽然一說像聽了一個新詞,第一次碰見放下了,第二次也,,第三次也,今天就好好把它給看明白。 概念:快速計算底數的n次冪。 例題:(想明白就自己拿出筆紙耐心看下去,自己寫出來的才有自信說看明白了)    求a的b次方;

POJ 1085 Triangle War(極大極小搜尋+alpha-beta剪枝

// // main.cpp // Richard // // Created by 邵金傑 on 16/8/29. // Copyright © 2016年 邵金傑. All rights reserved. // #include<iostream&g

n皇后問題(運算優化

n皇后問題 題目描述: 眾所不知, rly現在不會玩國際象棋。但是,作為一個OIer, rly當然做過八 皇后問題。這裡再囉嗦幾句,皇后可以攻擊到同行同列同對角線,在n*n的方格中擺n個皇后使其互

【題解】codeforces293B[AHSOFNU codeforces訓練賽2 by hzwer]D.Distinct Paths dfs+剪枝+運算

題目連結 Description You have a rectangular n × m-cell board. Some cells are already painted some of k colors. You need to paint each u

1019 Separate the Animals (35 分DFS或BFS搜尋+(運算狀態去重

題目連結:https://pintia.cn/problem-sets/994805148990160896/problems/994805149963239424 直接暴力搜尋每一種障礙的狀態,用dfs和bfs都可以(我用的dfs),沒找到一種狀態bfs檢查現在有多少個洞,有沒有動物相連。

搜尋_常規DFS_運算_HDOJ5547_Sudoku

點此開啟題目頁面 Problem Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself. It looks like

數獨:dfs+剪枝+運算+排除冗余+優化搜索順序(未完

main esp 測試用例 brush 數獨 方案 include blank \n 和藍橋杯以前一個題一樣,但是數據加強了,博主水平有限,沒做出來,先在這裏記錄一下,這裏正解,下面是博主的超時做法。最近準備考研,不能深入學習了。 題目描述 數獨是一種傳統益智遊戲,你需

javascript運算符——運算

javascript 二進制 二進制表示  ECMAScript中的所有數值都以IEEE-754 64位格式存儲,但位操作符並不直接操作64位的值,而是以32位帶符號的整數進行運算的,並且返回值也是一個32位帶符號的整數  這種位數轉換使得在對特殊的NaN和Infinity值應用位操作時,這兩個值都會

運算的特殊運用

font 掌握 一個數 個數 pan nbsp 異或 二進制位 位數 位運算的特殊運用 位運算主要有。&。|。~,^等幾種。這幾種在編程方面能極大地優化程序,所以掌握他們勢在必行,所以就總計一下。 &: 主要能夠用來求某數的當中一個二進制位。經

運算相關

使用 優化 lin 位數 pan ble 移位 移動 等於 位運算符/移位運算符 運算符 &運算符 操作數1的位操作數2的位&的結果位 1 1 1 1 0 0 0 1 0 0 0 0 |運算符 操作數1的位操作數2的位

運算

沒有 各種運算符 plain 簡單 center static lai 第一個 結果 java中有三種移位運算符 << : 左移運算符,num << 1,相當於num乘以2 >> : 右移運算符,num

JAVA 按運算符的解釋

按位運算符 位運算 按位按位運算符Java定義了幾個按位運算符,可以將其應用於整數類型long,int,short,char和byte。按位運算符對位執行,並執行逐位運算。假設a = 60和b = 13; 現在以二進制格式,他們將如下 -a = 0011 1100b = 0000 1101--------