zoukankan      html  css  js  c++  java
  • Codeforces 585D Lizard Era: Beginning

    Lizard Era: Beginning 

    折半之后搜就完事了, 直接存string字符串卡空间, 随便卡卡空间吧。

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PLL pair<LL, LL>
    #define PLI pair<LL, int>
    #define PII pair<int, int>
    #define SZ(x) ((int)x.size())
    #define ull unsigned long long
    using namespace std;
    
    const int N = 25;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 + 7;
    const double eps = 1e-8;
    
    int n, L[N], M[N], W[N];
    vector<int> vc1, vc2;
    
    struct Node {
        int L, M, W;
        char s[13][2];
    };
    vector<Node> tmp;
    map<pair<PII,int>, int> Map;
    
    Node t, ans1, ans2;
    
    void dfs(int x) {
        if(x == SZ(vc1)) {
            int who = SZ(tmp);
            tmp.push_back(t);
            int mn = min(t.L, min(t.M, t.W));
            auto it = Map.find(mk(mk(t.L-mn, t.M-mn), t.W-mn));
            if(it == Map.end() || tmp[it->se].L < tmp[who].L)
                Map[mk(mk(t.L-mn, t.M-mn), t.W-mn)] = who;
            return;
        }
        t.L += L[vc1[x]]; t.M += M[vc1[x]]; t.s[x][0] = 'L', t.s[x][1] = 'M';
        dfs(x + 1);
        t.L -= L[vc1[x]]; t.M -= M[vc1[x]];
    
        t.L += L[vc1[x]]; t.W += W[vc1[x]]; t.s[x][0] = 'L', t.s[x][1] = 'W';
        dfs(x + 1);
        t.L -= L[vc1[x]]; t.W -= W[vc1[x]];
    
        t.M += M[vc1[x]]; t.W += W[vc1[x]]; t.s[x][0] = 'M', t.s[x][1] = 'W';
        dfs(x + 1);
        t.M -= M[vc1[x]]; t.W -= W[vc1[x]];
    }
    
    void dfs2(int x) {
        if(x == SZ(vc2)) {
            int mn = min(t.L, min(t.M, t.W));
            int mx = max(t.L-mn, max(t.M-mn, t.W-mn));
            auto it = Map.find(mk(mk(mx-t.L+mn, mx-t.M+mn), mx-t.W+mn));
            if(it == Map.end()) return;
            int id = it->se;
            if(t.L + tmp[id].L > ans1.L + ans2.L) {
                ans1 = tmp[id];
                ans2 = t;
            }
            return;
        }
        t.L += L[vc2[x]]; t.M += M[vc2[x]]; t.s[x][0] = 'L', t.s[x][1] = 'M';
        dfs2(x + 1);
        t.L -= L[vc2[x]]; t.M -= M[vc2[x]];
    
        t.L += L[vc2[x]]; t.W += W[vc2[x]]; t.s[x][0] = 'L', t.s[x][1] = 'W';
        dfs2(x + 1);
        t.L -= L[vc2[x]]; t.W -= W[vc2[x]];
    
        t.M += M[vc2[x]]; t.W += W[vc2[x]]; t.s[x][0] = 'M', t.s[x][1] = 'W';
        dfs2(x + 1);
        t.M -= M[vc2[x]]; t.W -= W[vc2[x]];
    }
    
    int main() {
        cin >> n;
        for(int i = 0; i < n; i++)
            cin >> L[i] >> M[i] >> W[i];
        if(n == 1) {
            if(!L[0] && !M[0]) puts("LM");
            else if(!L[0] && !W[0]) puts("LW");
            else if(!M[0] && !W[0]) puts("MW");
            else puts("Impossible");
            return 0;
        }
        int c = n >> 1;
        for(int i = 0; i < c; i++) vc1.push_back(i);
        for(int i = c; i < n; i++) vc2.push_back(i);
    
        ans1.L = -inf; ans2.L = -inf;
        dfs(0);
        dfs2(0);
    
        if(ans1.L <= -inf) {
            puts("Impossible");
            return 0;
        }
        for(int i = 0; i < c; i++) cout << ans1.s[i][0] << ans1.s[i][1] << "
    ";
        for(int i = 0; i < n - c; i++) cout << ans2.s[i][0] << ans2.s[i][1] << "
    ";
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    Vtune 学习笔记 1 Finding Hotspots
    成都 宏碁 售后地址 官方
    Vtune 学习笔记 分析锁 Tutorial: Analyzing Locks and Waits
    (技术贴)铁道部12306网站瘫痪:网络购票技术之罪
    【转】移植之乱谈 深入理解Android 卷I作者谈
    FastReport集粹(一)
    FastReport集粹(二)
    在TDBGrid控件中为作修改过的记录进行标识!
    从此开始我的OGRE开发3D游戏之旅行。
    DBGrid 应用全书
  • 原文地址:https://www.cnblogs.com/CJLHY/p/10454347.html
Copyright © 2011-2022 走看看