関連するトピック
トピックリンク
羅バレー、https://www.luogu.com.cn/problem/P2392。
タイトル説明
最終試験、テストに必要kkksc03 4家族。したがって、ブラッシング問題セットを開始するには、各ブランチは、演習のセット、それぞれ、S1、S2、S3、S4を持っているタイトルトラック、各質問は変更になる場合があり、多少時間がかかる完了するA1、A2、...、 AS1、B1、B2、...、BS2、C1、C2、...、Cs3に、D1、D2、...、DS4。
kkksc03は、しかし、同じ家族の中で、同時に22種類の話題を計算することができ、容量、彼の左と右の脳を持っています。したがって、kkksc03は、部門の審査の枝でなければなりません。
彼は彼が審査を完了するための最短時間を知りたいと思ったので、物事は、可能な限り迅速に行って取得したいので、ロス・バレーのバグに対処するためにも切望kkksc03以来。
入力形式
11行目、4つの正の整数S1、S2、S3、S4:タイトルは、データの55行が含まれています。
ライン22は、A1、A2、...、AS1総数S1に、支店は、それぞれの質問が消費演習の最初のセットの時間を表しています。
B1、B2、...、BS2総数S2としてライン33、。
C1、C2、...、Cs3に総数S3のライン44、。
両方前掲の意味D1、D2、...、DS4総数S4、など55行、。
出力フォーマット
出力ライン、レビューのための最短時間が終了しています。
サンプル入力
1 2 1 3
5
4 3
6
2 4 3
サンプル出力
20
データ範囲
1≤S1、S2、S3、S4≤20日
1≤A1、A2、...、AS1、B1、B2、...、BS2、C1、C2、...、Cs3に、D1、D2、...、DS4≤ 60。
トピック分析
最短時間を参照してください、私たちが対応する動的計画法に飛んだ、このバックパックは01の問題を解決することが最適です。しかし、今回は問題を解決するためにDFSを使用しています。
問題の意味の分析
つまり、各コースは、トピックの数があり、各トピックには、問題解決の時間を持っているが、我々は、同じ時間、同じドアソリューションに2つの質問で、最短時間を求めることができ、4つのコースがあり、あります。適切にDFSを完了しました。
サンプルデータ解析
サンプルデータによると、我々としてもDFSのプロセスをシミュレートすることがあります。左と右の脳がご利用いただけますがあります。私たちは、このような検索処理することを左脳、右脳そして、と最初にあるたびに:すべての左脳の最初の(プログラム)、(左脳ソリューション最初の質問と2番目の質問は、1)左は左に、2を左右1 1は、4つの組み合わせので、2右1及び2は、右の1を持っている左。
第一の主題
そこに問題があるので、我々は得ることができます:
1、全体左脳:5を消費します。
2、全体の右脳:5を消費します。
従って、5分の最小時間の第1の主題。
第2の主題
我々が得ることができるように、2つの質問があります:
1、全体左脳:= 7 + 3 4を処理しました。
2、問題解決左脳、右脳は2を解く:加工MAX(4,3)= 4。
3、1を解く2、右脳の問題解決左脳:加工MAX(3,4)= 4。
図4に示すように、全体右脳:4 + 3 = 7処理しました。
従って4分の第2の最小時間を有する対象。
第三の主題
そこに問題があるので、我々は得ることができます:
1、全体左脳:6時間のかかります。
2、全体の右脳:6時間のかかります。
したがって、6分間の第三の対象の最小時間。
第四科目
我々が得ることができるように3つの質問があります:
1、左の脳のすべてが完了しています。このように処理は、4 + 2 + 3 = 9です。
図2は、左の脳は1,2の問題、三つの問題が解決する右脳が完了しています。このように処理(2 + 4,3)= 6最大です。
図3は、左の脳は1,3の問題、二つの問題が解決する右脳が完了しています。このように処理(2 + 3、4)= 5、最大です。
4、右の脳の問題を完了するために、質問1、2および3を完了するために左脳。それはMAX(2、4 + 3)= 7であり、このように処理されます。
5、左脳23完全なタイトル、完全なタイトル右の脳。このように処理(4 + 3、2)= 7最大です。
左の脳を解決するために6、二つの問題は、右の脳は1,3タイトルを完了しています。それはMAX(4、3 + 2)= 5であり、このように処理されます。
左脳を解決するために7、3つの問題が、右脳は1,2タイトルを完了しています。それはMAX(3、2 + 4)= 6であり、このように処理されます。
8、すべての右脳は完了です。このように処理は、4 + 2 + 3 = 9です。
したがって、5分間の第四の対象の最小時間。
ここで私たちが見ることができる2つの頭脳のすべての可能な組み合わせを列挙するために割り当てられたタイトルです。大量のデータならば、我々はマイナス分岐ヒントを使用することができます。上記の方法は、半分が無駄になります。
合計時間
NATURALは5 + 4 + 5 + 6 = 20です。
規模データ解析
タイトルの説明によれば、我々は知ることができる4人の被験者の合計、20件のトピックまで各被験者、及び4×20 = 80の、従って最大データセット。言い換えれば、DFSのタイトルサーチの使用は、あなたが剪定を必要とすることはできません。
アルゴリズムの考え方
1は、データが読み込まれます。
図2は、被写体から、トピックは、第DFSを開始します。
3、出力。
AC参照コード
暴力DFSバージョン
#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;
const int MAXN = 4;
const int MAXM = 22;
const int MAXT = 2;
int subjects[MAXN];//科目
int times[MAXN][MAXM];//时间
bool used[MAXN][MAXM];//是否复习完成
int Left;//左脑
int Right;//右脑
int minn;//某一门科目最小时间
//从第i门的第j题目开始复习
void dfs(int i, int j) {
//判断本次搜索是否结束
if (j>=subjects[i]) {
minn = min(minn, max(Left, Right));
return;
}
//左脑工作
Left += times[i][j];
dfs(i, j+1);
Left -= times[i][j];
//右脑工作
Right += times[i][j];
dfs(i, j+1);
Right -= times[i][j];
}
int main() {
for (int i=0; i<4; i++) {
cin >> subjects[i];
}
for (int i=0; i<4; i++) {
for (int j=0; j<subjects[i]; j++) {
cin >> times[i][j];
}
}
//搜索
int ans = 0;//最后的时间
for (int i=0; i<4; i++) {
Left=0;//左脑清零
Right=0;//右脑清零
minn = INT_MAX;//由于是要最小值
dfs(i, 0);//从第i门的第一题开始复习
ans += minn;
}
cout << ans << endl;
return 0;
}