【HDOJ】1818 It's not a Bug, It's a Feature!

状态压缩+优先级bfs。

  1 /* 1818 */
  2 #include <iostream>
  3 #include <queue>
  4 #include <cstdio>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <algorithm>
  8 using namespace std;
  9
 10 #define MAXM 105
 11
 12 typedef struct {
 13     int t;
 14     int bm, bp;    // before minus/plus
 15     int am, ap; // after minus/plus
 16 }  patch_t;
 17
 18 typedef struct node_t {
 19     int v, t;
 20     node_t() {}
 21     node_t(int vv, int tt) {
 22         v = vv; t = tt;
 23     }
 24     friend bool operator <(const node_t &a, const node_t &b) {
 25         return a.t > b.t;
 26     }
 27 } node_t;
 28
 29 int n, m;
 30 patch_t patch[MAXM];
 31 int visit[1<<20];
 32 char bs[25], as[25];
 33
 34 int bfs() {
 35     int i, j, k;
 36     int v, t;
 37     node_t nd = node_t((1<<n)-1, 0);
 38     priority_queue<node_t> Q;
 39
 40     memset(visit, 0x3f, sizeof(int)*(1<<n));
 41     visit[nd.v] = 0;
 42     Q.push(nd);
 43
 44     while (!Q.empty()) {
 45         nd = Q.top();
 46         if (nd.v == 0)
 47             return nd.t;
 48         Q.pop();
 49         for (i=0; i<m; ++i) {
 50             v = nd.v;
 51             if ((v&patch[i].bm)!=0 || (v&patch[i].bp)!=patch[i].bp)
 52                 continue;
 53             v |= patch[i].ap;
 54             v &= (~patch[i].am);
 55             t = nd.t + patch[i].t;
 56             if (t < visit[v]) {
 57                 Q.push(node_t(v, t));
 58                 visit[v] = t;
 59             }
 60         }
 61     }
 62
 63     return -1;
 64 }
 65
 66 int main() {
 67     int t = 0;
 68     int i, j, k;
 69
 70     #ifndef ONLINE_JUDGE
 71         freopen("data.in", "r", stdin);
 72         freopen("data.out", "w", stdout);
 73     #endif
 74
 75     while (scanf("%d%d",&n,&m)!=EOF && (n||m)) {
 76         for (i=0; i<m; ++i) {
 77             scanf("%d %s %s", &patch[i].t, bs, as);
 78             patch[i].bp = patch[i].bm = patch[i].ap = patch[i].am = 0;
 79             // handle before str
 80             for (j=0; j<n; ++j) {
 81                 if (bs[j] == ‘+‘)
 82                     patch[i].bp |= (1 << (n-1-j));
 83                 else if (bs[j] == ‘-‘)
 84                     patch[i].bm |= (1 << (n-1-j));
 85
 86             }
 87             // handle after str
 88             for (j=0; j<n; ++j) {
 89                 if (as[j] == ‘+‘)
 90                     patch[i].ap |= (1 << (n-1-j));
 91                 else if (as[j] == ‘-‘)
 92                     patch[i].am |= (1 << (n-1-j));
 93
 94             }
 95         }
 96         k = bfs();
 97         if (k < 0)
 98             printf("Product %d\nBugs cannot be fixed.\n\n", ++t);
 99         else
100             printf("Product %d\nFastest sequence takes %d seconds.\n\n", ++t, k);
101     }
102
103     return 0;
104 }

【HDOJ】1818 It's not a Bug, It's a Feature!

时间: 2024-12-28 13:02:16

【HDOJ】1818 It's not a Bug, It's a Feature!的相关文章

【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 << pos)); 将s中二进制第k位变成1的处理方式: s = s | (1 << pos); 2.二进制运算: [1] & : 1 & 1 = 1 , 1 & 0 = 0 , 0 & 0 = 0; 快速判断奇偶性: if(a & 1);//为奇数

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]

【HDOJ】3509 Buge&#39;s Fibonacci Number Problem

快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. 1 /* 3509 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #incl

【HDOJ】2424 Gary&#39;s Calculator

大数乘法加法,直接java A了. 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int n; 8 int i, j, k, tmp; 9 int top; 10 boolean flag; 11 int t

【HDOJ】2425 Hiking Trip

优先级队列+BFS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 25 8 9 typedef struct node_st { 10 int x, y, t; 11 node_st() {} 12 node_st(int xx, int yy, int tt)

【HDOJ】1686 Oulipo

kmp算法. 1 #include <cstdio> 2 #include <cstring> 3 4 char src[10005], des[1000005]; 5 int next[10005], total; 6 7 void kmp(char des[], char src[]){ 8 int ld = strlen(des); 9 int ls = strlen(src); 10 int i, j; 11 12 total = i = j = 0; 13 while (

【HDOJ】2795 Billboard

线段树.注意h范围(小于等于n). 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXN 200005 5 #define lson l, mid, rt<<1 6 #define rson mid+1, r, rt<<1|1 7 #define mymax(x, y) (x>y) ? x:y 8 9 int nums[MAXN<<2]; 10 int h, w; 11 12