ccf(最優配餐)
阿新 • • 發佈:2018-11-19
問題描述
試題編號: | 201409-4 |
試題名稱: | 最優配餐 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: | 問題描述 棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了一個急需解決的問題。 送餐的主要成本體現在路上所花的時間,每一份餐每走一個單位的距離需要花費1塊錢。每個客戶的需求都可以由棟棟的任意分店配送,每個分店沒有配送總量的限制。 現在你得到了棟棟的客戶的需求,請問在最優的送餐方式下,送這些餐需要花費多大的成本。 輸入格式 輸入的第一行包含四個整數n, m, k, d,分別表示方格圖的大小、棟棟的分店數量、客戶的數量,以及不能經過的點的數量。 輸出格式 輸出一個整數,表示最優送餐方式下所需要花費的成本。 樣例輸入 10 2 3 3 樣例輸出 29 評測用例規模與約定 前30%的評測用例滿足:1<=n <=20。 |
#include <iostream> #include <vector> #include <algorithm> #include <cstdio> #include <queue> #include <cmath> #include <string.h> #define maxn 1003 using namespace std; struct Node { int x,y,step; Node(){} Node(int a,int b,int c) { x = a; y = b; step = c; } }; struct direct { int x,y; } direct[4] = {{-1,0},{0,-1},{1,0},{0,1}}; int n;//方格圖的大小、。 int m;//棟棟的分店數量、 int k;//客戶的數量, int d;//以及不能經過的點的數量 int buys[maxn][maxn];//貨物量的分配 bool visited[maxn][maxn];//訪問地圖 int buyers; //顧客數量 long long ans;//答案 queue<Node>q; //佇列 bool legal(int x,int y) { return x>=1&&x<=n&&y>=1&&y<=n; } void BFS(int num) { int guest = 0; Node t; while(!q.empty()) { t = q.front(); q.pop(); for(int i = 0; i<4; i++) { int t_x = t.x+direct[i].x; int t_y = t.y+direct[i].y; int t_step = t.step; if(!legal(t_x,t_y)) { continue; } if(!visited[t_x][t_y]) { t_step++; if(buys[t_x][t_y]) { ans+=t_step*buys[t_x][t_y]; guest++; if(guest==num) return; } visited[t_x][t_y] = 1; q.push(Node(t_x,t_y,t_step)); } } } } /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char** argv) { int i,j,k; int x,y,c; cin>>n>>m>>k>>d; //初始化 memset(visited,0,sizeof(visited)); memset(buys,0,sizeof(buys)); //分店的初始化 for(i = 0; i<m; i++) { cin>>x>>y; q.push(Node(x,y,0)); visited[x][y] = 1; } //客戶的初始化 for(i = 0; i<k; i++) { cin>>x>>y>>c; if(buys[x][y]==0)//合併在同一地點的使用者 { buyers++; } buys[x][y] +=c; } for(i = 0;i<d;i++) { cin>>x>>y; visited[x][y] = 1; } BFS(buyers); cout<<ans; return 0; } /** 10 2 4 3 1 1 8 8 1 5 1 1 5 2 2 3 3 6 7 2 1 2 2 2 6 8 **/