service

【问题描述】

一家公司为它在各地的用户提供服务,公司有三名负责这项工作的员工,分别编号为1,2,3,服务的地点有n个,分别编号为1,2,3,...n,把从编号为p的服务地点直接到达编号为q的服务地点所需的移动费用记为C(p,q),显然C(p,p)=0(停留在原地不需要费用),但不保证对任意p,q均有C(p,q)=C(q,p)。

初始时员工1在地点1,员工2在地点2,员工3在地点3,现在公司依次收到了L个服务请求,每个请求需要一名员工赶到其指定的地点进行服务,员工可以选择直达,也可以选择经过若干个服务地点中转,特别地,如果指派的员工已在当前请求所在地,则该请求不需要任何移动费用即可被处理。

出于公平起见,所有请求必须按顺序处理,这意味着即使一名员工在赶往当前请求的途中经过之后的请求所在的地点,他也不可以先处理之后的请求,但是公司不限制每位员工赶往请求地点的路线,也允许一个服务地点有多名员工。

你的任务就是对于这L个请求,找到一个服务方案(即对每个请求分配合适的员工去服务以及规划移动路线),使得三名员工提供服务的总移动费用最小。

【输入格式】

每个测试点第一行为一个正整数T,表示该测试点内的数据组数,你需要对该测试点内的T组数据都分别给出正确的答案才能获得该测试点的分数。

接下来T组数据,每组数据第一行两个正整数n和L,含义如题目所述,接下来n行,每行n个非负整数,其中第p行第q个数表示C(p,q),最后一行包含一行L个正整数,依次描述每个请求指定的地点。

【输出格式】

对每组数据输出一行一个非负整数,表示最小的总移动费用。

 

【输入输出样例】

service.in

service.out

2

3 6

0 1 2

3 0 4

5 6 0

1 2 3 1 2 3

5 9

0 1 1 1 1

1 0 2 3 2

1 1 0 4 1

2 1 5 0 1

4 2 3 4 0

4 2 4 1 5 4 3 2 1

0

5

【样例解释】

    第一组测试数据中,所有可能的地点都有员工,因此不需要进行任何移动。

第二组测试数据中,三位员工初始在1 2 3三个地方,下面给出其中一种达到最小总移动费用的方案:

请求地点

指派员工

移动路线

员工所在地

当前总代价

(初始状态)

1 2 3

0

4

1

1->4

4 2 3

0+1=1

2

2

2

4 2 3

1+0=0

4

1

4

4 2 3

1+0=1

1

2

2->1

4 1 3

1+1=2

5

2

1->5

4 5 3

2+1=3

4

1

4

4 5 3

3+0=3

3

3

3

4 5 3

3+0=3

2

1

4->2

2 5 3

3+1=4

1

3

3->1

2 5 1

4+1=5

【数据规模与约定】

每个测试点5分,各个测试点数据范围如下:

测试点编号

n

L

1-3

n<=10

L<=10

4-6

n<=40

L<=10

7-10

n<=40

L<=100

11-14

n<=100

L<=100

15-17

n<=100

L<=500

18-20

n<=200

L<=500

对于所有的测试点,均有数据组数T<=5,地点数n>=3,给定的C矩阵主对角线上的数全部为0,且输入数据中所有的数均为不超过2000的非负整数。

同TYVJ1061【mobile service】

乍一眼看过去,不就是个dp吗,啪啪啪四维dp码完,看复杂度感觉有点不对啊,数组好像有点大啊,面临TLE和MLE的双风险。

很明显,这个四维dp的解法十分不优秀。

f[i][x][y][z]表示到了第i个阶段,x,y,z分别表示三个人的位置。

然后转移考虑最小代价即可。

思考优化:去除冗杂信息。

对于这三个人的位置,只需要得知两个,要么更新的是这两个其中之一,两个人位置都不更新就是剩下的一个位置进行了更新。

只需三维,代码如下:

ps:为什么要用floyd求任意两点之间的最短距离。(本题与tyvj1061的区别)

是否限制每个地点的员工数量。这点没看出来也是这题的丢分原因,我没有floyd。

给出service的代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = +;
const int maxL = +;
const int inf = 1e9;
int T,n,L,ans;
int c[maxn][maxn],f[maxL][maxn][maxn],p[maxL];
inline int read(){
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void work(){
p[] = ;
f[][][] = ;//记录1,2的状态
for(int i = ;i <= L; ++i){
for(int j = ;j <= n; ++j){
for(int k = ;k <= n; ++k){
f[i][j][k] = min(f[i][j][k],f[i-][j][k]+c[p[i-]][p[i]]);
f[i][p[i-]][k] = min(f[i][p[i-]][k],f[i-][j][k]+c[j][p[i]]);
f[i][j][p[i-]] = min(f[i][j][p[i-]],f[i-][j][k]+c[k][p[i]]);
}
}
}
for(int i = ;i <= n; ++i){
for(int j = ;j <= n; ++j){
ans = min(ans,f[L][i][j]);
}
}
printf("%d\n",ans);
}
int main(){
freopen("service.in","r",stdin);
freopen("service.out","w",stdout);
T = read();
while(T--){
ans = inf;
memset(f,0x3f,sizeof(f));
n =read(); L = read();
for(int i = ;i <= n; ++i){
for(int j = ;j <= n; ++j){
c[i][j] = read();
}
}
for(int i =;i <= L; ++i) p[i] = read();
for(int k = ;k <= n; ++k){
for(int i = ;i <= n; ++i){
for(int j = ;j <= n; ++j){
c[i][j] = min(c[i][j],c[i][k]+c[k][j]);
}
}
}
work();
}
return ;
}

noip模拟【service】的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  10. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

随机推荐

  1. callback源码分析——callback_iter和callback

    uvm_callback_iter,定义了function,first,last,next,prev的函数, 其中定义的还是相应uvm_callbacks的静态函数: 所以之前uvm_callback ...

  2. C++的类型转换

    一.类型转换名称和语法 1.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a    2.C++风格的类型转换提供了4种类型转换操作符来应对 ...

  3. Java基础语法(一 )

    一.关键字 关键字概述 被Java语言赋予特定含义的单词 关键字特点 组成关键字的字母全部小写 关键字注意事项 goto和const作为保留字存在,目前并不使用 关键字单词 用于定义数据类型的关键字 ...

  4. 关于ajax原理介绍

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  5. xshell的一些基本操作

    挺全面的一篇文章,没事可以看看. (1)命令ls——列出文件  ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件  ls a* 列出当前目录下以字母a开头的所有文件  l ...

  6. Spring源码阅读(八)

    摘要: 本文首先将举例说明如何使用BeanWrapper,然后根据例子中的结果分析BeanWrapper的源码.由于在spring中BeanWrapperImpl是BeanWrapper接口的唯一实现 ...

  7. android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测

    android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测https://dev.bangcle.com/ 业内专业的应用加固服务供应商 帮助数十万APP抵御破解风险,早 ...

  8. RBAC

    什么是rbac? -- 基于角色的权限控制  Role-Based Access Control 一个url就代表一个权限 // url分配给角色,角色分配给用户 -- 6个model,4张表 菜单表 ...

  9. 75.Java异常处理机制throws

    package testDate; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IO ...

  10. Charles 从入门到精通 --转

    文章目录 1. 目录及更新说明 2. Charles 限时优惠 3. 简介 4. 安装 Charles 5. 将 Charles 设置成系统代理 6. Charles 主界面介绍 7. 过滤网络请求 ...