L2-4オンライン有名人のポイントクロッキング戦略

観光名所に火がついた場合、それは「ネットセレブスポット」と呼ばれます。誰もがインターネットの有名人のスポットに遊びに来ます。これは一般に「チェックイン」として知られています。さまざまなインターネット有名人にクロックインする迅速な(節約)そして幸せな(お金)方法は「レイダース」と呼ばれます。あなたの仕事は、各有名人のポイントを1回だけチェックインできるものを見つけ、多数の戦略から道路への支出を最小限に抑えることです。

入力形式:
最初に、2つの正の整数が最初の行に示されます。インターネット有名人ポイントの数N(1 <N≤200)とインターネット有名人ポイント間のチャネル数Mです。M行に続いて、各行は、インターネット有名人ポイントが始まる「ネット有名人ポイント1インターネット有名人ポイント2コスト」の形式で、アクセス可能な2つのインターネット有名人ポイントとこの道路の移動コスト(正の整数)を示します。 1 Nの数に;同時に、それはまたいくつかのインターネット有名人のポイントにあなたの家の費用を与えます、フォーマットは同じです、そしてあなたの家の数は0に固定されています。

次の行は、テストする戦略の数である正の整数Kを示します。次に、K行、各行はチェックする戦略を示します。形式は次のとおりです
。nV1 V2…Vn

ここで、n(≤200)はガイド内のインフルエンサーポイントの数であり、Viはパス上のインフルエンサーポイントの数です。ここでは、自宅から出発し、V 1からチェックインし、最後にVnから帰宅することを前提としています。

出力形式:
最初の行の要件を満たす戦略の数を出力します

2行目には、最初に各有名人のポイントを1回だけチェックインし、道路での支出が最も少ない戦略のシーケンス番号(1から開始)を出力してから、スペースで区切って戦略の合計料金を出力します。そのような戦略が一意でない場合は、シリアル番号が最も小さい戦略が出力されます。

タイトルは、少なくとも1つの効果的な戦略があり、合計料金が10 ^ 9を超えないことを保証します。

入力サンプル:

6 13
0 5 2
6 2 2
6 0 1
3 4 2
1 5 2
2 5 1
3 1 1
4 1 2
1 6 1
6 3 2
1 2 1
4 5 3
2 0 2
7
6 5 1 4 3 6 2
6 5 2 1 6 3 4
8 6 2 1 6 3 4 5 2
3 2 1 5
6 6 1 3 4 5 2
7 6 2 1 3 4 5 2
6 5 2 1 4 3 6

サンプル出力:

3
5 11

説明例:
項目2、3、4、および6は、戦略の基本要件を満たしていません。つまり、自宅から始めて、各オンライン有名人スポットに1回だけチェックインして、帰宅することはできません。したがって、条件を満たす3つの戦略があります。

最初の戦略の合計料金は次のとおりです。(0-> 5)2 +(5-> 1)2 +(1-> 4)2 +(4-> 3)2 +(3-> 6)2 +( 6-> 2)2 +(2-> 0)2 = 14;

5番目の戦略の合計料金は同じ方法で計算できます。1+ 1 + 1 + 2 + 3 + 1 + 2 = 11、これはより経済的な戦略です。

7番目の戦略の合計料金は同じ方法で計算できます:2 + 1 + 1 + 2 + 2 + 2 + 1 = 11、これは5番目の戦略のコストと同じですが、シーケンス番号が大きいため、出力されません。

初めて答えが間違っているという提案をしたときは、テストポイントに合格しなかったと思ったので、固定質問セット22点のラダーコンペ質問に提出しましたが、最後のテストポイントは合格しませんでした。合格しました。プログラムを確認してもう一度質問を読みました。、合計コストが10 9を超えていないことがわかり、2 27 <10 9 <2 36、intの範囲を超える可能性があることは明らかです。変更するだけです。長い間
前回の訪問の変数preを設定します。初期値は0です。これは、自宅から出発して景勝地に入らないことを意味します。合法である場合(訪問したことがなく、preに接続されたパスがある場合)、カウンター++とコスト変数が更新されます。更新されない場合、プランは直接拒否されます。現在の計画が入力され、発見数== nで、最後の景勝地がホームパスに接続されている場合、これは妥当な計画であり、コスト変数が更新されます(最後の景勝地間のコストを追加するため)スポットとホーム)、コストが最小コスト変数minxと比較され、小さい方が更新され、最小プラン番号変数posが同時に更新されます。
#include <cstring>
#include <iostream>
using namespace std;

int graph[201][201];
bool vis[201] = {
    
    false};
const long long inf = 1e9 + 1;//总费用不超过1e9
int n, m, k;

int main() {
    
    
    cin >> n >> m;
    while (m--) {
    
    
        int t1, t2, t3;
        cin >> t1 >> t2 >> t3;
        graph[t1][t2] = graph[t2][t1] = t3;
    }
    int cnt = 0; //攻略的个数
    int pos, minx = inf, id, p;
    cin >> k;
    for (int i = 1; i <= k; i++) {
    
    
        int pre = 0;
        long long sum = 0;
        int len = 0;
        cin >> p;
        bool flag = true;
        for (int j = 0; j < p; j++) {
    
    
            cin >> id;
            if (graph[pre][id] && !vis[id]) {
    
    
                sum += graph[pre][id];
                len++;
                pre = id;
                vis[id] = true;
            } else {
    
    
                flag = false;
            }
        }
        if (len == n && flag && graph[id][0]) {
    
    
            cnt++;
            sum += graph[id][0];
            if (sum < minx) {
    
    
                minx = sum;
                pos = i;
            }
        }
        memset(vis, false, sizeof(vis));//每次更新,因为下一个方案要重新判断
    }
    cout << cnt << endl << pos << " " << minx;
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45845039/article/details/112603460