问题描述
试题编号: 201409-4
试题名称: 最优配餐
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。   栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。   方格图中的线表示可以行走的道路,相邻两个格点的距离为1。栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。
  送餐的主要成本体现在路上所花的时间,每一份餐每走一个单位的距离需要花费1块钱。每个客户的需求都可以由栋栋的任意分店配送,每个分店没有配送总量的限制。   现在你得到了栋栋的客户的需求,请问在最优的送餐方式下,送这些餐需要花费多大的成本。
输入格式
  输入的第一行包含四个整数n, m, k, d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。   接下来m行,每行两个整数xi, yi,表示栋栋的一个分店在方格图中的横坐标和纵坐标。   接下来k行,每行三个整数xi, yi, ci,分别表示每个客户在方格图中的横坐标、纵坐标和订餐的量。(注意,可能有多个客户在方格图中的同一个位置)   接下来d行,每行两个整数,分别表示每个不能经过的点的横坐标和纵坐标。
输出格式
  输出一个整数,表示最优送餐方式下所需要花费的成本。
样例输入
10 2 3 3 1 1 8 8 1 5 1 2 3 3 6 7 2 1 2 2 2 6 8
样例输出
29
评测用例规模与约定
  前30%的评测用例满足:1<=n <=20。   前60%的评测用例满足:1<=n<=100。   所有评测用例都满足:1<=n<=1000,1<=m, k, d<=n^2。可能有多个客户在同一个格点上。每个客户的订餐量不超过1000,每个客户所需要的餐都能被送到。

由店出发找买家:

 //201409-4
//最优配餐
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int n,m,k,d;
short map[][],dir[][]={{,},{,},{-,},{,-}};
bool within(int x,int y){
if(x<=||x>n||y<=||y>n)
return false;
return true;
}
struct node{
int x,y,step;
node(int a=,int b=,int c=){
x=a;
y=b;
step=c;
}
};
queue<node> q;
long long bfs(){
node n;
int t=;
long long sum=;
while(!q.empty()){
n=q.front();
q.pop();
int i,x,y;
for(i=;i<;i++){
x=n.x+dir[i][];
y=n.y+dir[i][];
if(within(x,y)&&!(map[x][y]&)){
map[x][y]|=;
if(map[x][y]&){
sum+=(map[x][y]>>)*(n.step+);
t++;
if(t==k)
return sum;
}
q.push(node(x,y,n.step+));
}
}
}
}
int main(){
//freopen("D:\\INPUT.txt","r", stdin);
while(scanf("%d %d %d %d",&n,&m,&k,&d)!=EOF){
int i,j,x,y;
memset(map,,sizeof(map));
for(i=;i<m;i++){
scanf("%d %d",&x,&y);
map[x][y]|=;
q.push(node(x,y,));
}
for(i=;i<k;i++){
scanf("%d %d %d",&x,&y,&j);//大于0的表示定餐数目
map[x][y]=(map[x][y]|)+(j<<);
}
for(i=;i<d;i++){
scanf("%d %d",&x,&y);
map[x][y]|=;
}
printf("%I64d\n",bfs());
}
return ;
}

由买家出发找店家(超时,只拿了60):

 //201409-4
//最优配餐
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int n,m,k,d;
short map[][],dis[][],dir[][]={{,},{,},{-,},{,-}};
bool within(int x,int y){
if(x<=||x>n||y<=||y>n||map[x][y]==-)
return false;
return true;
}
int main(){
//freopen("D:\\INPUT.txt","r", stdin);
while(scanf("%d %d %d %d",&n,&m,&k,&d)!=EOF){
int i,j,x,y;
memset(map,,sizeof(map));
for(i=;i<m;i++){
scanf("%d %d",&x,&y);
map[x][y]=-;//分店是-1
}
queue<int> q;
for(i=;i<k;i++){
scanf("%d %d %d",&x,&y,&j);//大于0的表示定餐数目
if(!map[x][y])
q.push(x*+y);
map[x][y]+=j;
}
for(i=;i<d;i++){
scanf("%d %d",&x,&y);
map[x][y]=-;//不能通过时-2
}
int min;
long long sum=;
while(!q.empty()){
memset(dis,-,sizeof(dis));
min=;
int t=q.front();
q.pop();
queue<int> qq;
qq.push(t);
dis[t/][t%]=;
while(!qq.empty()){
int tt=qq.front(),xx,yy;
qq.pop();
x=tt/;
y=tt%;
//cout<<t<<' '<<x<<' '<<y<<' '<<dis[x][y]<<endl;
if(dis[x][y]>=min){
continue;
}
//cout<<"d"<<endl;
if(map[x][y]==-){//找到店
//cout<<"c"<<endl;
min=dis[x][y];
continue;
}
for(i=;i<;i++){
//cout<<dir[i][0]<<' '<<dir[i][1]<<endl;
xx=x+dir[i][];
yy=y+dir[i][];
//cout<<xx<<' '<<yy<<endl;
//cout<<xx<<' '<<yy<<endl;
if(within(xx,yy)){//没有越界并且可以访问
if(dis[xx][yy]>dis[x][y]+||dis[xx][yy]==-){
dis[xx][yy]=dis[x][y]+;
qq.push(xx*+yy);
}
}
}
}
//cout<<min<<endl;
//cout<<map[t/1000][t%1000]<<endl;
//cout<<min*map[t/1000][t%1000]<<endl;
sum+=min*map[t/][t%];
}
cout<<sum<<endl;
}
return ;
}

CCF 201409-4 最优配餐的更多相关文章

  1. CCF CSP 201409-4 最优配餐

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-4 最优配餐 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越 ...

  2. CCF模拟题 最优配餐

    最优配餐 时间限制: 1.0s 内存限制: 256.0MB   问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在 ...

  3. ACM-最优配餐

    题目描述: 最优配餐  时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问 ...

  4. CCF-最优配餐(BFS)

    最优配餐   问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题.栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方 ...

  5. CCF 最优配餐 (BFS)

    问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的 ...

  6. 最优配餐_暴力bfs

    问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的 ...

  7. csp20140904最优配餐_Solution

    Solution 经典bfs,所有的点到店的最短距离 其中一开始队列的长度为店的数目 一个点可能有多个订单 关于数据大小: 1.1000*(1000*1000)*2000=2,0000,0000,00 ...

  8. [Ioi2007]Miners 矿工配餐(BZOJ1806)

    [Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 214  Solved: 128 Description 现有两 ...

  9. BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )

    dp... ------------------------------------------------------------------------------- #include<cs ...

随机推荐

  1. Tomcat配置文件与启动顺序

    三个配置应用的位置: 1.conf目录下的server.xml文件:此方式为Eclipse默认配置方法,同时也是三种方式中优先级最高的. <?xml version="1.0" ...

  2. Unity3D 之PC客户端的分辨率自定义

    在Player Setting中可以自定义分辨率,但在PC版本中如果使用Display Resolution Dialog选项,会发现在分辨率选项中只有预定义的那些,而并没有在Player Setti ...

  3. Log4net日志

    log4net简介(摘抄于百度百科):      log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库 ...

  4. nej+regular环境使用es6的低成本方案

    本文来自 网易云社区 . 希望在生产环境中使用es6/7,babel应该是最普遍的选择.这是babel官网中,它对自己的定义: Babel 自带了一组 ES2015 语法转化器.这些转化器能让你现在就 ...

  5. java远程开关机

    最近,很多客户向我们反馈终端启动后异常的问题,因此,我自己做了一个远程开关的小工具,该工具的目的在于通过批量的方式来控制终端启动.其设计逻辑是通过服务端发送cmd指令 ,客户端接受并执行指令,把结果返 ...

  6. 2018版OCP考试052最新题库及答案-35题

    35.Your database is using Automatic Memory Management. Which two SGA components must be managed manu ...

  7. 在Python程序中调用Java代码的实现

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 前言 开发Python程序,需求中需要用到Ja ...

  8. CentOS 中文支持

    其中通过 yum 方式安装的最简单快速: yum groupinstall "Chinese Support" 装完中文语言包之后,它不会自己变成中文,得修改文件/etc/sysc ...

  9. Tomcat入门级小白教程

    Tomcat 类似与一个apache的扩展型,属于apache软件基金会的核心项目,属于开源的轻量级Web应用服务器,是开发和调试JSP程序的首选,主要针对Jave语言开发的网页代码进行解析,Tomc ...

  10. Struts2框架action层学习心得体会

    在struts2框架中,当action处理完之后,就应该向用户返回结果信息,该任务被分为两部分:结果类型和结果本身. 结果类型提供了返回给用户信息类型的实现细节.结果类型通常在Struts2中就已预定 ...