ホームページ  >  記事  >  ウェブフロントエンド  >  SRM 638 Div2_html/css_WEB-ITnose

SRM 638 Div2_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:54:55872ブラウズ

2333。 。

TC エントリの数が少なく、fst が一定であるため、div2 に落としました。

幸いなことに、終了後は div1 に戻りました。 。

250

水の質問

500

水の質問。 。

bfs を直接展開するだけです

判定に注意してください。展開するために Cantor も使用しましたが、これは本当に不要です。 。

1000

この質問の意味を誤解していました。 。他の人のコードを見ると何かが正しくないと言いました

しかし、それはまだ非常に簡単な質問です

どのリーフノードを書き込むかのバイナリ列挙

次に、各書き込み方法の最短パスを見つけます

最短を見つけた後パス、エッジを列挙します

エッジの 2 つのノードが u で、v の重みが w であると仮定します

バーンアウトする時間である最大値 (dis[u]+dis[v]+w )/2 を見つけます


これはなぜですか?

ある面が最後に焼かれると仮定すると、2つの状況があります

1つは、uとvの両方が他のノードからの火によって焼かれるということです

1つは、あなたが焼かれるということです火v から

最初の方法、dis[u] > dis[v] と仮定しましょう

答えは ( L-(dis[u] - dis[v]) ) / 2 + dis[u ] = (dis [u] + dis[v] + L) / 2

2 番目の

dis[v] + L = dis[u]

次に、同じ dis[u] = (dis[v] + L + dis[u) ]) / 2

どちらもこれで表すことができます

では便宜上2で割ることはしません


struct node {    int v, w;    node () {}    node (int _v, int _w) {v = _v; w = _w;}};vector<node>g[22];int ind[22], lea[22], pos[22], d[22], vis[22], q[1111];set<int> s;class CandleTimerEasy{public:    int differentTime(vector <int> A, vector <int> B, vector <int> len)    {        int n = A.size() + 1;        for(int i = 0; i < n; i++) g[i].clear();        memset(ind, 0, sizeof(ind));        for(int i = 0; i < n - 1; i++) {            g[A[i]].push_back(node(B[i], len[i]));            g[B[i]].push_back(node(A[i], len[i]));            ++ind[A[i]]; ++ind[B[i]];        }        s.clear();        int cnt = 0;        memset(pos, -1, sizeof(pos));        for(int i = 0; i < n; i++) {            if(ind[i] == 1) {                lea[cnt] = i;                pos[i] = cnt;                cnt++;            }        }        for(int sta = 1; sta < (1 << cnt); sta ++) {            int h = 0, t = 0;            for(int i = 0; i < n; i++) {                d[i] = INF; vis[i] = 0;                if(pos[i] != -1) {                    if(sta & (1 << pos[i])) {                        q[t++] = i;                        d[i] = 0;                        vis[i] = 1;                    }                }            }            while(h < t) {                int u = q[h++];                vis[u] = 0;                for(int i = 0; i < g[u].size(); i++) {                    int v = g[u][i].v;                    int w = g[u][i].w;                    if(d[u] + w < d[v]) {                        d[v] = d[u] + w;                        if(!vis[v]) {                            q[t++] = v;                            vis[v] = 1;                        }                    }                }            }            int mx = 0;            for(int i = 0; i < n - 1; i++) mx = max(mx, d[A[i]] + d[B[i]] + len[i]);            s.insert(mx);        }        return (int)s.size();    }}



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。