您的位置:首页 > 其它

CCF模拟题 最优配餐

2015-03-21 19:39 162 查看
[b]最优配餐[/b]

时间限制:1.0s
内存限制:256.0MB
问题描述
  栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。
  栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。
  方格图中的线表示可以行走的道路,相邻两个格点的距离为1。栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。

#include <bits/stdc++.h>
#define pii pair<int,int>
#define LL long long
using namespace std;
const int maxn = 1010;
const int dir[4][2] = {-1,0,0,-1,1,0,0,1};
int n,m,k,d,e[maxn][maxn] = {0};
struct node {
int x,y,step;
node(int a = 0,int b = 0,int c = 0) {
x = a;
y = b;
step = c;
}
};
queue<node>q;
bool isIn(int x,int y) {
return x > 0 && x <= n && y > 0 && y <= n;
}
LL bfs() {
LL ans = 0;
int cnt = 0;
while(!q.empty()) {
node now = q.front();
q.pop();
for(int i = 0; i < 4; ++i) {
int nx = now.x+ dir[i][0];
int ny = now.y + dir[i][1];
if(isIn(nx,ny)&&!(e[nx][ny]&1)) {
e[nx][ny] |= 1;
q.push(node(nx,ny,now.step+1));
if(e[nx][ny]&2) {
ans += (now.step+1)*(e[nx][ny]>>2);
if(++cnt == k) return ans;
}
}
}
}
return ans;
}
int main() {
int x,y,z;
while(~scanf("%d %d %d %d",&n,&m,&k,&d)) {
for(int i = 0; i < m; ++i) {
scanf("%d %d",&y,&x);
q.push(node(x,y,0));
e[x][y] |= 1;
}
for(int i = 0; i < k; ++i) {
scanf("%d %d %d",&y,&x,&z);
e[x][y] = (e[x][y]|2) + (z<<2);
}
for(int i = 0; i < d; ++i) {
scanf("%d %d",&y,&x);
e[x][y] |= 1;
}
printf("%I64d\n",bfs());
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: