zoukankan      html  css  js  c++  java
  • uva 10317 Equating Equations (搜索题)

    uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1258

      又是一道搜索,不过我用了状态压缩来做,开始的时候有两个剪枝加进去,从而3s的时限都超过了。一个是数的和的奇偶性判断,另外一个剪的不明显,那就是统计的时候正或负的和一旦超过整体和的一半时,不用继续加下去。

      这道题麻烦之处主要是它的模拟,输入输出的模拟因为没想到怎么可以更简便,于是就十分暴力的处理了,庆幸这么乱都没有打错。

    记录一下代码:

    View Code
     1 typedef vector<VI> VVI;
     2 typedef vector<char> VCH;
     3 #define REP(i, n) for (int i = 0; i < (n); i++)
     4 #define REP_1(i, n) for (int i = 1; i <= (n); i++)
     5 #define PB push_back
     6 
     7 VI rec;
     8 VCH op;
     9 int pos, neg;
    10 
    11 void preProc(char *s) {
    12     char buf[3];
    13     int x;
    14     bool eq = false;
    15 //    cout << s << endl;
    16     rec.clear();
    17     op.clear();
    18     pos = 1, neg = 0;
    19     while (true) {
    20         while (*s && !isdigit(*s)) s++;
    21         if (!*s) break;
    22         sscanf(s, "%d", &x);
    23         rec.PB(x);
    24         while (isdigit(*s)) s++;
    25         if (!*s) break;
    26         sscanf(s, "%s", buf);
    27         op.PB(buf[0]);
    28         if (buf[0] == '=') eq = true, neg++;
    29         else if (eq ^ (buf[0] == '+')) pos++;
    30         else neg++;
    31     }
    32 }
    33 
    34 void work() {
    35     int p, n, cnt;
    36     int sum = 0;
    37     REP(i, SZ(rec)) {
    38         sum += rec[i];
    39     }
    40     if (sum & 1) { puts("no solution"); return ;}
    41     sum >>= 1;
    42     VI POS, NEG;
    43     POS.clear();
    44     NEG.clear();
    45     int end = 1 << SZ(rec), sz = SZ(rec);
    46     REP(i, end) {
    47         p = n = cnt = 0;
    48         REP(j, sz) {
    49             if (p > sum || n > sum) break;
    50             if (i & (1 << j)) p += rec[j], cnt++;
    51             else n += rec[j];
    52         }
    53         if (p == n && (cnt == pos || cnt == neg)) {
    54             REP(j, sz)
    55                 if (i & (1 << j)) POS.PB(rec[j]);
    56                 else NEG.PB(rec[j]);
    57             if (cnt == pos) {
    58                 int np = 0, nn = 0, no = 0;
    59                 printf("%d", POS[np++]);
    60                 bool eq = false;
    61                 while (no < SZ(op)) {
    62                     if (op[no] == '=') {
    63                         eq = true;
    64                         printf(" = %d", NEG[nn++]);
    65                     } else if (op[no] == '+') eq ? printf(" + %d", NEG[nn++]) : printf(" + %d", POS[np++]);
    66                     else eq ? printf(" - %d", POS[np++]) : printf(" - %d", NEG[nn++]);
    67                     no++;
    68                 }
    69             } else {
    70                 int np = 0, nn = 0, no = 0;
    71                 printf("%d", NEG[nn++]);
    72                 bool eq = false;
    73                 while (no < SZ(op)) {
    74                     if (op[no] == '=') {
    75                         eq = true;
    76                         printf(" = %d", POS[np++]);
    77                     } else if (op[no] == '+') eq ? printf(" + %d", POS[np++]) : printf(" + %d", NEG[nn++]);
    78                     else eq ? printf(" - %d", NEG[nn++]) : printf(" - %d", POS[np++]);
    79                     no++;
    80                 }
    81             }
    82             puts("");
    83             return ;
    84         }
    85     }
    86     puts("no solution");
    87 }
    88 
    89 int main() {
    90     char buf[10000];
    91     while (gets(buf)) {
    92         preProc(buf);
    93         work();
    94     }
    95     return 0;
    96 }

    ——written by Lyon

  • 相关阅读:
    Git 简单使用
    java web 简单的分页显示
    java web 实现验证码
    第一个MapReduce程序
    xgboost安装指南(win10,win7 64位)
    受限玻尔兹曼机(Restricted Boltzmann Machine)分析
    卷积神经网络概述及python实现
    集体智慧编程_第二章(提供推荐)_1
    EditText的inputType常用取值
    关于泛型的一些细节
  • 原文地址:https://www.cnblogs.com/LyonLys/p/uva_10317_Lyon.html
Copyright © 2011-2022 走看看