牛客網アルゴリズム問題(優先キュー)

2013 ワード

リンク:https://www.nowcoder.com/acm/contest/79/E
出典:牛客網
タイトルの説明
小欧は代数の授業を受ける時、先生はみんなに1つの問題を提出して、不定方程式ax+by=cの整数解の存在の要件は何ですか.
聡明な欧さんはすぐに手を挙げて先生に完璧な答えを出して、放課後、先生は欧さんを呼んで彼に思考問題をあげました.
正の整数aとbの値と2つのシーケンスSとVを与え、最小代価の正の整数cを求めて不定方程式ax+by=cを解き、cは以下の条件を満たさなければならない.
1.cを構成する数字は、シーケンスS内でなければならない.
2.使用シーケンスSごとに1つの数字S
iは代価Vを消費する
i.
3.シーケンスS内の数字の使用回数は限定されない.
4.cの首位はu,cの最下位はvであった.(u,vもシーケンスS内)
複数の代価のような小さな答えがあれば、cの辞書順が一番小さいものだけが必要です.
説明を入力:
         a,b,n (1 <= a, b <= 100000,  2 <= n <= 10) 
    n     Si (0 <= Si <= 9) 
    n     Vi (1 <= Vi <= 1000) 
         u,v(1 <= u <= 9,  0 <= v <= 9, u != v) 

出力の説明:
            c 。
             。
        -1 。

例1
入力
10 15 2
2 0
1 1
2 0

しゅつりょく
20

例2
入力
17 17 4
0 1 2 7
1 1 1 1000
1 0

しゅつりょく
1020

//分析:まず三つの配列を定義し、配列はa,bに関連する
//ax+by=c式に解があればc%gcd(a,b)=0
//一番大切なのは優先キュー思想
コード:
#include
using namespace std;
#define ll long long
#define INF 1000000
struct node
{
    int s,v;
    bool operator que;
    que.push({x,0});
    while(!que.empty())
    {
        node tem=que.top();
        que.pop();
        if((tem.s*10+v)%p==0)
        {
            print(tem.s);
            cout<dis[tem.s]+V[i])
            {
                dis[ns]=dis[tem.s]+V[i];
                pre[ns]=tem.s;
                num[ns]=i;
                que.push({ns,dis[ns]});
            }
        }
    }
    return 0;
}
int main()
{
    int a,b,n;
    cin>>a>>b>>n;
    p=__gcd(a,b);
    int w[12];
    for(int i=0;i>w[i];
    }
    for(int i=0;i>V[w[i]];
 
    cin>>u>>v;
    if(bfs(u%p)==0)cout<