ural 2071 - Juice Cocktails

題意:有n杯調和果汁,用A,B,P三種果汁調,每一次可以往一個連續區間添加一種果汁,問最少需要加多少次。

n很大,最大10的五次方,但是狀態數量很有限,只有7種,相同的果汁肯定要連續放才能使添加次數最少,而且連續相同的果汁不管有多少,總是跟一杯的時候結果相同,那麼直接對於七種狀態全排列找最優解就行了。

代碼因爲時間比較緊,寫的比較挫一點,可以進一步優化。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
using namespace std;
map<string, int> s;
string rs[10];
map<string, int>::iterator p;
void init() {
    s["A"] = 0;
    rs[0] = "A";
    s["AB"] = 1;
    rs[1] = "AB";
    rs[2] = "ABP";
    rs[3] = "AP";
    rs[4] = "B";
    rs[5] = "BP";
    rs[6] = "P";
    s["ABP"] = 2;
    s["AP"] = 3;
    s["B"] = 4;
    s["BP"] = 5;
    s["P"] = 6;
}
int id[10];
vector<int> dx[10];
int main() {
    init();
    int n, i, j, k;
    string a;
    while(~scanf("%d", &n)) {
        for(i = 0; i < 10; i++)
            dx[i].clear();
        for(i = 0; i < n; i++) {
            cin >> a;
            int b = s[a];
            dx[b].push_back(i + 1);
        }
        int m = 0;
        for(i = 0; i < 7; i++) {
            if(dx[i].size()) {
                id[m++] = i;
            }
        }
        int ans = 100;
        do {
            int d = id[0];
            int t = rs[d].size();
            for(i = 1; i < m; i++) {
                d = id[i];
                for(j = 0; j < rs[d].size(); j++) {
                    for(k = 0; k < rs[id[i - 1]].size(); k++) {
                        if(rs[d][j] == rs[id[i - 1]][k])
                            break;
                    }
                    if(k == rs[id[i - 1]].size())
                        t++;
                }
            }
            if(t < ans)
                ans = t;
        }while(next_permutation(id, id + m));
        sort(id, id + m);
        do {
            int d = id[0];
            int t = rs[d].size();
            for(i = 1; i < m; i++) {
                d = id[i];
                for(j = 0; j < rs[d].size(); j++) {
                    for(k = 0; k < rs[id[i - 1]].size(); k++) {
                        if(rs[d][j] == rs[id[i - 1]][k])
                            break;
                    }
                    if(k == rs[id[i - 1]].size())
                        t++;
                }
            }
            if(t == ans) {
                int is = 0;
                printf("%d\n", ans);
                for(i = 0; i < m; i++) {
                    for(j = 0; j < dx[id[i]].size(); j++) {
                        if(is)
                            printf(" ");
                        else is = 1;
                        printf("%d", dx[id[i]][j]);
                    }
                }
                printf("\n");
                break;
            }
        }while(next_permutation(id, id + m));
    }
    return 0;
}

發佈了67 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章