(死...)
わずか30ポイント。。
かなり正常な最初の二つの質問、数論+半分の答えの最初の質問、私は自分の成功についてはあまり場合は、配列(生と死弱気)、2番目の質問のDPが(実際、私は、つまり、アナログでも大丈夫だと思います再び破裂ハロ)
3番目の質問。。さて、タイトルバーを見てください。。
最初の感じは確かに暴力、この質問に多くのポイントは、K = 0は完全なバックパックを解くことができるの一部です。(30点)
はい私はこの質問を見ました。。
二感じ。。おそらく、DP
しかし、ガチョウは、この問題の正解である最短経路、ダイクストラとSPFAを行います。。
I????(黒疑問符)
それは先生の説明です
これは、教師のプログラムであり、
<ビット/ STDC ++ H>の#include の#define 20001 の#define N 5001 使用して 名前空間STD。 typedefの長い 長いLL。 構造体ノード{ int型のX; LL V; ブール 演算子 <(constのノード&OTH)のconst { 戻り V> oth.v。 } }。 PRIORITY_QUEUE <ノード> Q。 INT [A] VIS、[A]予め、N、M、K。 LL [N]、DIS [A]、合計[N]。 LL getin(){ LL S = 0。文字 C =getchar関数(); 一方、(C < ' 0 ' || C> ' 9 ')C = GETCHAR()。 一方、(C <= ' 9 ' && C> = ' 0 ')S = S * 10ll + C - ' 0 '、C = GETCHAR()。 リターン秒; } ボイドダイクストラ(){ ため(int型 iは= 1 ; iは< 1 ]; iは++)DIS [I] = 1E18。 DIS [ 0 ] = 0 ; Q。0、0 })。 一方、(!q.empty()){ int型、U = q.top()X。 q.pop(); もし(VIS [U])続けます。 VIS [U] = 真; 用(int型 I = 1 iが++; iが<= N ){ int型 [V =(U + [I])%を1 ]。 もし(DIS [U] + [I] < DIS [V]){ DIS [V] = DIS [U] + [I]。 事前[V] = I、q.push((ノード){V、DIS [V]})。 } } } } int型のmain(){ freopenは(" equip.in "、" R " 、STDIN)。 freopenは(" equip.out "、" W " 、STDOUT)。 scanf関数(" %D%D%D "、&N、&M、およびK); 以下のために(int型 I = 1 [I] = iが++; iが<= N) ()getin します。 ダイクストラ(); 以下のために(int型 I = 1 ; I <= M。= 場合(X <DIS [X%[ 1 ])のprintf(" なしの\ n " ); 他の{ のprintf(" はい" ); もし(Kの== 1 ){ ための(int型 J = 1 ; J <= N; J ++)和[J] = 0 ; 和[ 1 ] + =(X - DIS [X%[ 1 ])/ [ 1 ]。 一方、(X%の[ 1 ]){ 和[プレ[Xの%[ 1 ]]] ++ getin()。 ; X =((X - [プレ[X%[ 1 ]]])%[ 1 ] + [ 1 ])%[ 1 ]。 } のための(INT J = 1 ; J <= N; J ++)のprintf(" %I64d " 、和[J])。 } のprintf(" の\ n " ); } } 戻り 0 。 }
(私は無能な理解します...)
そう!私が理解しやすい方法をしたいと思います!
Useカラム不定方程式の解法
各機器mについて、カラム式
N 1 X 1 + N 2 ×2 + N 3 X3 + ... + N N XN = M
以下のような課題を解決
(N-1までの時間拡張ユークリッドライン溶液を用いて全体としてそれぞれ)
大きな最短の時間複雑より少し
(プログラムは印象づけるでしょうチューニングするために、書く時間を持つことになります)