zoukankan      html  css  js  c++  java
  • 【万能的搜索,用广搜来解决DP问题】ZZNU 2046 : 生化危机 / HDU 1260:Tickets

    2046 : 生化危机

    时间限制:1 Sec内存限制:128 MiB
    提交:19答案正确:8

    题目描述

    当致命的T病毒从Umbrella Corporation 逃出的时候,地球上大部分的人都死去了。
    麻烦的是,他们并没有真正的死去。

    爱丽诗在一个狭窄的巷子中,遇见了n个丧尸(编号1-n),巷子太窄了,爱丽诗只能按顺序解决它们。
    爱丽诗擅长用匕首和弓箭,当爱丽诗面临编号为i的丧尸时,匕首每次只能解决一个丧尸用时为a[i],弓箭每次能且只能解决两个相邻的丧尸(丧尸i,和丧尸i+1),用时为b[i]。

    爱丽诗看了下时间正好是20:00:00,那么爱丽诗最快能在什么时刻解决战斗呢?

    输入

    先输入一个正整数T(0<T<15),代表有T组数据,对于每组数据包含三行内容
    第一行输入一个正整数n,代表丧尸的个数
    第二行输入n个整数,分别代表用匕首解第i个丧尸决所花费的时间(单位为秒)
    第三行输入n-1个整数,分别代表用弓箭同时解决第i个和第i+1个丧尸所用的时间(单位为秒)。
    所有输入均不超过 100000

    输出

    对于每组数据,输出爱丽诗能够解决战斗的最早时间

    样例输入

    复制
    1
    2
    1 3
    4
    

    样例输出

    复制
    20:00:04
    

    提示

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>   //这两个题存在惊人的相似程度, 原因其实也很简单--你想
    #include<queue>
    using namespace std;
    int k,n,w[1000],a[1000],b[1000],ans[1000];
    struct node
    {
        int x;
        int step;
    };
    void bfs() ;
    int main()
    {
        int i,T;
        cin>>T;
        while(T--)
        {
            memset(ans,0,sizeof(ans));k=0;
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            cin>>n;
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            for(i=1;i<=n-1;i++)
                scanf("%d",&b[i]);
            bfs();
            sort(ans,ans+k);
            int t=ans[0];
            int h=20,m=0,s=0;
            h=(h+t/3600)%24;
            m=(t/60)%60;
            s=t%60;
            printf("%02d:%02d:%02d\n",h,m,s);
        }
        return 0;
    }
    
    void bfs()  //激活下面的注释区,你将看到整个搜索的大致过程
    {
        memset(w,0,sizeof(w));
        queue<node>Q;
        struct node  q,p;
        q.x=0;q.step=0;
        Q.push(q);// cout<<q.x<<" "<<q.step<<" ";
        while( Q.size()>0 )
        {
            p=Q.front();
            Q.pop();
           for(int i=0;i<=1;i++)
           {
               if(p.step>=n)
               {
                   ans[k++]=p.x;//cout<<p.x<<" "<<p.step<<" ";
                  continue;
               }
               if(i==0&&(p.step+1<=n))
               {
                   q.x=p.x+ a[p.step+1];q.step=p.step+1;
               }
               else if((i==1)&&(p.step+2<=n))
               {
                   q.x=p.x+ b[p.step+1];q.step=p.step+2;
               }
               else{}
    
             //   cout<<i<<" q.x: "<<q.x<<" q.step: "<<q.step<<endl;
                   Q.push(q);
    
           }
        }
    
    
        return ;
    }

    总结:学长们说的很对,搜索是万能的!如果题目不要求时间复杂度,不要求内存,理论上任何一个题目都是可以做出来的。hdu上的那题需要更改一下,有兴趣的同学们可以试试!其实这是一道DP水题!!

    【杭电的原题链接   1260:Tickets 】http://acm.hdu.edu.cn/showproblem.php?pid=1260

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<string>
     6 #include<cstring>    // HDU  1260:Tickets 
     7 using namespace std;
     8 int a[2003],b[2003],dp[2003],n;
     9   int main()
    10   {
    11       int i,j,T,k,m;
    12       cin>>T;
    13       while(T--)
    14       {
    15           memset(a,0,sizeof(a));memset(b,0,sizeof(b));
    16           memset(dp,0,sizeof(dp));
    17           cin>>n;
    18           for(i=1;i<=n;i++)
    19             scanf("%d",&a[i]);
    20           for(i=1;i<=n-1;i++)
    21             scanf("%d",&b[i]);
    22           dp[1]=a[1];
    23           for(i=2;i<=n;i++)
    24           {
    25              dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
    26           }
    27           m=dp[n];
    28           int hh=8,mm=0,ss=0;
    29           hh=(hh+m/3600)%24;m=m%3600;
    30           mm=m/60;
    31           ss=m%60;
    32           printf("%02d:%02d:%02d",hh,mm,ss);
    33           if(hh<12)
    34               printf(" am\n");
    35           else
    36               printf(" pm\n");
    37       }
    38 
    39      return 0;
    40   }

    你懂了吧!傻眼了吧!

    你不逼自己一把,你永远都不知道自己有多优秀!只有经历了一些事,你才会懂得好好珍惜眼前的时光!
  • 相关阅读:
    8-6.布局元素实战
    Unity3D NGUI插件(3.12/2018/2019)
    GoLang 数据结构-二叉树
    GoLang 数据结构-哈希表(散列表)
    GoLang 四大经典排序(冒泡排序,选择排序,插入排序,快速排序)写法及执行效率
    GoLang 数据结构-单向链表,双向链表,单向环形链表
    GoLang 数据结构-环形队列
    GoLang 数据结构-稀疏数组
    GoLang 海量用户聊天系统(TCP-Socket网络编程+Redis数据库+协程)
    GoLang 使用协程和管道获取随机数
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/6767812.html
Copyright © 2011-2022 走看看