zoukankan      html  css  js  c++  java
  • 题目:飙车

    题目描述

    [说明]此题中出现的所有数字均为整数
    [背景]有天SubRaY发现宇宙新秀在玩一个游戏叫Need For Speed(什么?连大名鼎鼎的极品飞车都没听说过..),他发现宇宙新秀总是逆行,于是出现以下对话:
    SubRaY:你怎么老是在逆行道跑..
    宇宙新秀:近!
    SubRaY:你就不怕撞车..
    宇宙新秀:你提前写个程序计算一下不就完了!
    SubRaY:……
    SubRaY实在不会写这个程序,于是他交给你..
    [题目描述]已知公路总长L米,一共有K个赛道,你的赛车总是和公路上其他的普通的车走相反的方向,并且所有的车每秒沿赛道行驶1m(具体看图)(宇宙新秀:我的Evo IV怎么这么烂….).
    问题是:跑到终点最少撞多少次车?

    我们简化一下模型,画一个(L+1)*K的网格,设所有的车都是点,并且每秒末都会出现在这个网格的某个顶点上.公路上其他的车都以固定的1m/s的速度自上而下行驶,而你的跑车自下而上行驶,并且每秒可以从一个点行驶到它上方\左上方\右上方的点(假设飘移不浪费时间,具体请看图).

    我们假设,撞车不会使车损坏,不会使车减速(宇宙新秀:我的Evo IV怎么这么强~~)
    对于撞车的设定:当每秒末你的车和另外一辆车处在同一点上时,算撞车;你的车和另一辆车迎面开过来,算撞车.具体请看下图:

    假设一开始你可以选择任意一个赛道开始比赛,要求你写一个程序,计算到达终点至少要撞多少次车.

    对于上边的例子,只要开始选择第三赛道开始跑,然后一路向北,就可以不撞车而到达终点.
    [对样例2的说明]
    初始 第一秒 第二秒 第三秒
    距终点0m 1111
    距终点1m 1111 1111
    距终点2m 1111 1111 1111
    距终点3m 0000 1111 1111 1P11
    距终点4m 1111 0000 P111 1111
    距终点5m 0000 P111 0000 1111
    距终点6m C
    C代表该点只有你的车,P代表该点既有你的车又有其他的车.最优方案为第一秒直走,与一辆车相撞,第二秒直走,又与一辆车相撞,第三秒斜向右走,又与一辆车相撞,总共三次.如果第三秒直走,将与两辆车相撞,那么就撞了四次,所以三次最优.
    [对样例3的说明]
    不停地斜着走
    [数据范围]1<=n<=100,1<=k<=10

    输入格式

    首行两个数,L,K,表示赛道距离,以及有几个赛道.
    接下来L行,每行K个字符,第i行第j个字符表示公路距终点距离为i-1的第j个赛道的初始状态:0表示该点没有车,1表示该点有车.
    铭记一点:初始时你的车在第L+1行,你可以指定一个第L+1行的位置为你的车的初始位置,而第L+1行是不在输入文件里的.

    输出格式

    一个数ans,表示最少撞车次数

    题解:

    动归+相对运动,另外迎面相撞要考虑3种情况

    代码实现:

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    int main()
    {
        int f[101][11]={0},a[101][11],n,k,i,j,l,t;char s;
        
        cin>>n>>k;
        
        for(i=n;i>=1;i--)
        for(j=1;j<=k;j++){
                          cin>>s;
                          a[i][j]=s-48;
                          f[i][j]=0xfffffff;
                          }
        
        for(i=2;i<=n;i=i+2)
         for(j=1;j<=k;j++)   
         {
          if(f[i][j]>f[i-2][j]+a[i][j]+a[i-1][j]) f[i][j]=f[i-2][j]+a[i][j]+a[i-1][j];
          if(j<k&&f[i][j]>f[i-2][j+1]+a[i][j]) f[i][j]=f[i-2][j+1]+a[i][j];
          if(j>1&&f[i][j]>f[i-2][j-1]+a[i][j]) f[i][j]=f[i-2][j-1]+a[i][j];                   
                             }                        
                   
         int mi=100000;
         for(i=1;i<=k;i++)
         if(f[n][i]<mi) mi=f[n][i];
         
         cout<<mi<<endl;
         
         return 0;            
        
        }
    
  • 相关阅读:
    Windows Azure Cloud Service (14) 使用Windows Azure诊断收集日志记录数据
    Windows Azure Cloud Service (13) 用Visual Studio 2010 将应用程序部署到Windows Azure平台
    Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
    Windows Azure Storage (5) Windows Azure Drive
    Windows Azure Storage (7) 使用工具管理Windows Azure Storage
    SQL Azure(二) SQL Azure vs SQL Server
    webbrowser的自动提交
    提取视频的背景声音的软件
    Listview列排序的bug原因
    两个奇怪的问题
  • 原文地址:https://www.cnblogs.com/noip/p/2324212.html
Copyright © 2011-2022 走看看