poj 1700 poj 3404

来源:互联网 发布:windows iot 安装软件 编辑:程序博客网 时间:2024/05/16 12:37

      经典的过桥问题。只要这两道题一起做,就可以做对了(之前老是考虑少一种情况。。。思维能力有待提高)。

      具体解法如下:

      n==1时,直接输出答案

      n==2时,输出最大值

      n==3时,输出三者和

      n>=4时,两种策略,均转化成4人时的情形求最优解。设4人过河速度为A<B<C<D,那么有两种策略:

      先AB过,A回,CD过,B回,即temp=A+2*B+D

      先AD过,A回,再AC过,A回,即temp=2*A+C+D(忘了这种情况)

然后取其中的最小值即可。也就是说,在2*B<A+C时选方案1,否则选方案2.

      多做dp和贪心题是锻炼思维的好方法,以后要多多训练思维才行。

 

 

      以下是代码:(poj 1700)

 

  1. #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int M=1100;
    int a[M];
    int n;
  2. int main()
    {
     int T;
     scanf("%d",&T);
     while(T--)
     {
      int i;
      bool flag=false;
      scanf("%d",&n);
      for(i=1;i<=n;i++)
      {
       scanf("%d",&a[i]);
      }
      sort(a+1,a+n+1);
      int ans=0;
      while(n)
      {
       if(n==1)
       {
        ans+=a[1];
        n=0;
       }
       else if(n==2)
       {
        ans+=a[2];
        n=0;
       }
       else if(n==3)
       {
        ans+=a[1]+a[2]+a[n];
        n=0;
       }
       else
       {
        if(2*a[2]<a[1]+a[n-1])
        {
         ans+=a[1]+2*a[2]+a[n];
         n-=2;
        }
        else
        {
         ans+=2*a[1]+a[n-1]+a[n];
         n-=2;
        }
       }
      }
      printf("%d/n",ans);
     }

     return 0;
    }

poj 3404 的只要把case那个去掉即可,看了题目就懂了。

原创粉丝点击