201409-4 最優配餐
阿新 • • 發佈:2020-08-24
實現
#include <cstdio> #include <queue> #include <vector> using namespace std; #define MAX_MAP_SIZE 0x3ff #define MAX_POINT_NUM 0xff000 struct point { int x; int y; }; struct order_point { int x,y; int order_num; }; int dx_dy[4][2] = { {1,0}, {-1,0}, {0,1}, {0,-1} }; int map[MAX_MAP_SIZE][MAX_MAP_SIZE]; bool visit[MAX_MAP_SIZE][MAX_MAP_SIZE]; queue<point> stores; vector<order_point> customs; int map_size, store_num, custom_num, stuck_num; inline bool inRange(int x, int y) { if (x >= 1 && x <= map_size && y >= 1 && y <= map_size) { return true; } else { return false; } } int main() { scanf("%d%d%d%d", &map_size, &store_num, &custom_num, &stuck_num); for (int i = 0;i < store_num;++i) { point store; scanf("%d%d", &store.x, &store.y); stores.push(store); visit[store.x][store.y] = true; } for (int i = 0;i < custom_num;++i) { order_point custom; scanf("%d%d%d",&custom.x,&custom.y,&custom.order_num); customs.push_back(custom); } for (int i = 0;i < stuck_num;++i) { int x_tmp, y_tmp; scanf("%d%d", &x_tmp, &y_tmp); map[x_tmp][y_tmp] = -1; visit[x_tmp][y_tmp] = true; } while(!stores.empty()) { point cur_point = stores.front(); stores.pop(); for(int i = 0;i < 4;++i) { int cur_x = cur_point.x + dx_dy[i][0]; int cur_y = cur_point.y + dx_dy[i][1]; if (inRange(cur_x,cur_y) && !visit[cur_x][cur_y] && map[cur_x][cur_y] != -1) { point point_tmp; point_tmp.x = cur_x; point_tmp.y = cur_y; stores.push(point_tmp); map[cur_x][cur_y] = map[cur_point.x][cur_point.y] + 1; visit[cur_x][cur_y] = true; } } } long long res = 0; for (int i = 0;i < customs.size();++i) { res += map[customs[i].x][customs[i].y] * customs[i].order_num; } printf("%lld",res); }