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. Apache Storm Installation

    安装的过程参照此处的过程介绍(https://www.tutorialspoint.com/apache_storm/apache_storm_installation.htm) 安装的过程要安装3个 ...

  2. windows编程之Windows Shell 编程

    参考书<VC++ Windows Shell Programming>   这里仅仅是记录下该资源,推荐到下文列出的连接进行查看   用VC++ 进行Windows Shell 扩展编成 ...

  3. bash shell 编程练习

    原始文件: find /etc -name passwd 2>&1 | tee ee.log 1. cat -n 把 e.log 的文档内容加上行号后输入 e2.log 这个文档里: x ...

  4. [转]Hive开发经验问答式总结

    本文转载自:http://www.crazyant.net/1625.html 本文是自己开发Hive经验的总结,希望对大家有所帮助,有问题请留言交流. Hive开发经验思维导图 Hive开发经验总结 ...

  5. 如何删除自己上传的CSDN资源(亲测有效)

    今天发现有一个资源上传错了,想重新上传,删掉以前的资源,才发现CSDN并没有提供删除资源的功能,然后去网上搜了下,这才删除了,不知道怎么删除的小伙伴看过来~ 1.首先,找到自己想要删除资源的页面,举个 ...

  6. 【转载】unittest参数化(paramunittest)

    前言 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 前面讲数据驱动的时候,用ddt可以解决多组数据传入,自动生成多个测试用例.本篇继续介绍 ...

  7. web前端利用turf.js生成等值线、等值面

    样例如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  8. GUI常用对象介绍2

    %示意line对象的用法 hf=figure; hl=plot([:]); %示意line对象的属性 get(hl) %设置line的颜色 set(hl,'Color','r'); %设置每个点形状 ...

  9. 理解Sql Server 事务隔离层级(Transaction Isolation Level)

    关于Sql Server 事务隔离级别,百度百科是这样描述的 隔离级别:一个事务必须与由其他事务进行的资源或数据更改相隔离的程度.隔离级别从允许的并发副作用(例如,脏读或虚拟读取)的角度进行描述. 隔 ...

  10. Java基础再复习(继承、多态、方法内部类**、HashMap用法**、参数传递**)

    ###继承: package com.shiyan; public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark ...