UVA城市里的间谍

Solution

这一道题的状态很好想,用f[i][j]来表示第i秒在第j个车站至少要等多久,预处理出在第i秒第j个车站是否有车,注意数据可能会超过T,要注意清零。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=55;
int t[N],ht[10005][N][2],cnt,k,n,T,m1,f[10005][N];
int main(){
    freopen("a.in","r",stdin);
    while(scanf("%d",&n)==1&&n){
        scanf("%d",&T);
        memset(ht,0,sizeof(ht));
        memset(t,0,sizeof(t));//清零
        for(int i=1;i<n;i++)scanf("%d",&t[i]);
        int sum;
        scanf("%d",&m1);
        for(int i=1;i<=m1;i++){
          scanf("%d",&sum);
          for(int j=1;j<=n;j++)
           ht[sum][j][0]=1,sum+=t[j];//正向不变
        }
        scanf("%d",&m1);
        for(int i=1;i<=m1;i++){
          scanf("%d",&sum);
          for(int j=n;j>=1;j--)
           ht[sum][j][1]=1,sum+=t[j-1];//记住-1
        }
        for(int i=1;i<n;i++)f[T][i]=0x3f3f3f3f;
        f[T][n]=0;
        for(int i=T-1;i>=0;i--)
         for(int j=1;j<=n;j++){
             f[i][j]=f[i+1][j]+1;
             if(j<n&&ht[i][j][0]&&i+t[j]<=T)
              f[i][j]=min(f[i][j],f[i+t[j]][j+1]);
             if(j>1&&ht[i][j][1]&&i+t[j-1]<=T)
              f[i][j]=min(f[i][j],f[i+t[j-1]][j-1]);
         }
        printf("Case Number %d: ",++cnt);
        if(f[0][1]>=0x3f3f3f3f)puts("impossible");//0x3f挂了
        else printf("%d\n",f[0][1]);
    }
} 

原文地址:https://www.cnblogs.com/coder-cjh/p/11409809.html

时间: 2024-10-02 06:00:22

UVA城市里的间谍的相关文章

UVa 1025 城市里的间谍

https://vjudge.net/problem/UVA-1025 题意:一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短,输出最短等车时间. 思路:先用一个has_train[t][i][0]来表示在t时刻,在车站i,是否有往右开的车.同理,has_train[t][i][1]用来保存是否有往左开的车. 用d(i,j)表示时刻i,你在车站j,最少还需要等待多长时间.边界条件是d(T,n)=0,其他d(T,i)为正无穷

动态规划初步--城市里的间谍

一.题目 某城市的地铁是线性的,有n(2 ≤ n ≤ 50)个车站,从左到右编号为1~n.有M1辆车从第一站开始往右开,还有M2辆从第n站开始往左开.在时刻0,Mario从第一站出发,目的是在T时刻会见在n站的一个间谍.要求其在车站的等待时间足够短. 二.解题思路 状态由当前时间和当前所在站决定,我们可以用dp[i][j]表示在时刻t,第i站最少还需要等待的时间.易只T时刻的情况容易确定, dp[T][j] = (j == n ? INF : 0),而T时刻之前的dp值,可以由T时刻及其之后的决

uva1025城市里的间谍

某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n.有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开. 列车在相邻站台间所需的运行时间是固定的,因为所有列车的运行速度是相同的. 在时刻0,Mario从第1站出发,目的在时刻T(0≤T≤200)会见车站n的一个间谍.在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的时间尽量短. 列车靠站停车时间忽略不计,且Mario身手敏捷,即时两辆方向不同的列车在同一时间靠站,Mario也能完成换乘. [输入格式

UVA1025 城市里的间谍 A Spy in the Metro

#include<iostream> #include<cstdio> #include<memory.h> using namespace std; #define min(a,b) (a)<(b)?(a):(b) #define INF 0x3f3f3f3f #define N 55 #define M 220 int k,n,T,M1,M2,a,b; int t[N]; int f[M][N]; bool trn[M][N][2]; int main(){

动态规划初学

数字三角形: 定义状态(i,j):表示当前所处位置 定义指标函数 d(i,j) :表示从格子(i,j)出发能得到的最大和 找到状态转移方程: d(i,j)=a(i,j)+max{d(i+1,j),d(i+1,j+1)} 总状态为O(n^2),每个状态决策为O(1),总的时间复杂度为O(n^2). 方法:直接递归 缺点:重复计算过多 优化:记忆化搜索 或者: 递推计算(关键 边界和计算顺序) DAG 嵌套三角形: 定义状态(i,j):表示矩形的二元关系,为了通过图来建模? PS:(i)表示从结点i

UVA - 590Always on the run(递推)

题目:UVA - 590Always on the run(递推) 题目大意:有一个小偷现在在计划着逃跑的路线,但是又想省机票费.他刚开始在城市1,必须K天都在这N个城市里跑来跑去,最后一天达到城市N,问怎样计划路线的得到最少的费用. 解题思路:一开始题目意思就理解有些问题. dp[k][i]:代表在第k天小偷从某一个城市(除了i)坐飞机飞到城市i(到达城市i也是在这一天).第k天的话,就看这一天坐哪个航班,加上之前的费用是最小的,就选这个方案.然后k+ 1天就又是由第k天推出来的. 状态转移方

要和这个城市说再见了!

来到这个城市不到2年就要说再见了,有点不舍离开这座城市. 当然来到这个城市有好的一面让自己不愿离开,同时也有一些地方让自己非常怨恨!在这座城市里自己留给自己印象最深刻还是软件园和创业街及大学园,因为这里 才是那些创业者的家,是他们精神支柱的地方. 在软件园里工作有不同岗位的人,有的是白领,有的是创客,有的是员工. 在软件园溜达,仔细观察,有的人有着非房的气质,这样的人一定经历过痛苦的磨难或正在经历痛苦的磨难.当然也有一般的员工,也在拼命努力地工作.有时9点 多钟从外面回学校,她(他)们才刚刚下班

2016亚洲城市GDP50强出炉

2017年年1月,中国各省GDP排名,台湾排第6:广东,江苏,山东,浙江,河南,台湾,四川,湖北,河北,湖南,我国台湾地区去年的GDP增长率为1.4%,总量折合人民币约为37329.1亿元,加入全国榜单排名第六,在河南省和四川省之间.2015年,河南省GDP首次超过台湾. 比较城市经济形态中的制高点--金融业,以及领军型企业的数量,广州与香港也有不小的差距: 首次!2016亚洲城市GDP50强出炉 2017-07-15 00:30GDP/榜单 全球的城市战争正在打响.城市不仅意味着更多的资源集聚

树形动态规划 fjutoj-2131 第四集,聚集城市

第四集,聚集城市 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 在小A解读完手机信息后,得到了特工们的位置情报以及他们最近将会又一次聚会(除了谈论了关于抓捕小A和小C的事情外,主要谈论了关于走私事情-) 因为小C原本是他们的内部人员,所以她知道这个组织有一个习惯,即特工们每次选择聚会的城市,他们都会选择使所有组员所在市距离聚会城市的路程的和最小的城市,而且每个城市最多有一