Codevs 1163:訪問藝術館——題解

又沒有背景……後期有時間再……
——————————————
http://codevs.cn/problem/1163/

題目描述 Description
皮爾是一個出了名的盜畫者,他經過數月的精心準備,打算到藝術館盜畫。藝術館的結構,每條走廊要麼分叉爲二條走廊,要麼通向一個展覽室。皮爾知道每個展室裏藏畫的數量,並且他精確地測量了通過每條走廊的時間,由於經驗老道,他拿下一副畫需要5秒的時間。你的任務是設計一個程序,計算在警察趕來之前(警察到達時皮爾回到了入口也算),他最多能偷到多少幅畫。

輸入描述 Input Description
第1行是警察趕到得時間,以s爲單位。第2行描述了藝術館得結構,是一串非負整數,成對地出現:每一對得第一個數是走過一條走廊得時間,第2個數是它末端得藏畫數量;如果第2個數是0,那麼說明這條走廊分叉爲兩條另外得走廊。數據按照深度優先得次序給出,請看樣例

輸出描述 Output Description
輸出偷到得畫得數量

樣例輸入 Sample Input
60
7 0 8 0 3 1 14 2 10 0 12 4 6 2

樣例輸出 Sample Output
2

數據範圍及提示 Data Size & Hint
s<=600

走廊的數目<=100
——————————————
tree[i][j]表示i節點拿j個畫需要多少時間
完後……就完了啊!!!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int tree[201][601];
int dis[201][201];
int t;
const int INF=214748364;
int hua[201]={0};
int sum=0;
void read(int fa,int i){
    scanf("%d",&dis[fa][i]);
    int ha;
    scanf("%d",&ha);
    if(ha==0){
        read(i,i*2);
        read(i,i*2+1);
        hua[i]=hua[i*2+1]+hua[i*2];
        for(int j=0;j<=hua[i];j++){
            for(int k=0;k<=j;k++){
                int f=0;
                if(k!=0)f+=dis[i][i*2]*2;
                if(j-k!=0)f+=dis[i][i*2+1]*2;
                tree[i][j]=min(tree[i][j],tree[i*2][k]+tree[i*2+1][j-k]+f);
            }
        }
    }else{
        hua[i]=ha;
        sum+=ha;
        for(int j=0;j<=ha;j++){
            tree[i][j]=j*5;
        }
    }
    return;
}
int main(){
    scanf("%d",&t);
    for(int i=0;i<=200;i++){
        tree[i][0]=0;
        for(int j=1;j<=600;j++){
            tree[i][j]=INF;
        }
    }
    read(1,2);
    for(int i=sum;i>=0;i--){
        if(tree[2][i]+dis[1][2]*2<=t){
            printf("%d",i);
            return 0;
        }
    }
    return 0;
}
發佈了59 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章