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;            
        
        }
    
  • 相关阅读:
    dreamvc框架(一)ioc容器的集成
    1040. Longest Symmetric String (25)
    虚指针存在证明及虚函数表
    Kibana中doc与search策略的区别
    AngularJS API之bootstrap启动
    AngularJS 技术总结
    Elasticsearch Javascript API增删改查
    AngularJS 中的Promise --- $q服务详解
    Ruby编程实践
    Ruby测试小代码[计算50以内的素数]
  • 原文地址:https://www.cnblogs.com/noip/p/2324212.html
Copyright © 2011-2022 走看看