#10777. 搜索算法(NOIP2010)过河问题

搜索算法(NOIP2010)过河问题

(NOIP2010)过河问题

在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸。在伸手不见五指的黑夜里,过桥时必须借助灯光来照明,不幸的是,他们只有一盏灯。另外,独木桥上最多能承受两个人同时经过,否则将会坍塌。每个人单独过独木桥都需要一定的时间,不同的人需要的时间可能不同。两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间。现在输入N(2<=N<1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸。

#include<iostream>
#include<string>
using namespace std;
const int SIZE=100;
const int INFINITY=10000;
const bool LEFT=true;
const bool RIGHT=false;
const bool LEFT_TO_RIGHT=true;
const bool RIGHT_TO_LEFT=false;
int n,hour[SIZE];
bool pos[SIZE];

int max(int a,int b){
    return a>b?a:b;
}

int go(bool stage){
    int i,j,num,tmp,ans;
    if(stage==RIGHT_TO_LEFT){
        num=0;
        ans=0;
        for(i=1;i<=n;i++)
            if(pos[i]==RIGHT){
                num++;
                if(hour[i]>ans)
                    ans=hour[i];
            }
        if(①)
            return ans;
        ans=INFINITY;
        for(i=1;i<=n-1;i++)
            if(pos[i]==RIGHT)
                for(j=i+1;j<=n;j++)
                    if(pos[j]==RIGHT){
                        pos[i]=LEFT;
                        pos[j]=LEFT;
                        tmp=max(hour[i],hour[j])+②;
                        if(tmp<ans)
                            ans=tmp;
                        pos[i]=RIGHT;
                        pos[j]=RIGHT;
                    }
        return ans;
    }
    if(stage==LEFT_TO_RIGHT){
        ans=INFINITY;
        for(i=1;i<=n;i++)
            if(③){
                pos[i]=RIGHT;
                tmp=④;
                if(tmp<ans)
                    ans=tmp;
                ⑤;
            }
        return ans;
    }
    return 0;
}

int main(){
    int i;
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>hour[i];
        pos[i]=RIGHT;
    }
    cout<<go(RIGHT_TO_LEFT)<<endl;
    return 0;
}

①处应填( )。
{{ select(1) }}

  • num<=0
  • num<=1
  • num<=2
  • num<=3

②处应填( )。
{{ select(2) }}

  • go(LEFT)
  • go(RIGHT)
  • go(LEFT_TO_RIGHT)
  • go(RIGHT_TO_LEFT)

③处应填( )。
{{ select(3) }}

  • pos[i]==LEFT
  • pos[i]==RIGHT
  • pos[i]==LEFT_TO_RIGHT
  • pos[i]==RIGHT_TO_LEFT

④处应填( )。
{{ select(4) }}

  • hour[i]+go(RIGHT_TO_LEFT)
  • hour[i]-go(RIGHT_TO_LEFT)
  • hour[i]+go(LEFT_TO_RIGHT)
  • hour[i]-go(LEFT_TO_RIGHT)

⑤处应填( )。
{{ select(5) }}

  • pos[i]=LEFT
  • pos[i]=RIGHT
  • pos[i]=LEFT_TO_RIGHT
  • pos[i]=RIGHT_TO_LEFT