zoukankan      html  css  js  c++  java
  • CCF CSP 201409-4 最优配餐

    思路:

    1.学会将多源在一开始时全部加入队列,然后bfs求最优的做法;
    2.用一个二维数组表示目前该点离店最近的距离,所有距离初始化为1000*1000以上的值;
    3.将所有订单,以坐标和量按序存储起来,之后直接挨个累加就好了;
    4.总开销可能会超过int范围,所以可以使用long long;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<int,int> p;
    typedef long long ll;
    #define N 1005
    #define m_p(a,b) make_pair(a,b)
    #define p_b(a) push_back(a)
    #define rp(i,n) for(int i=0;i<n;i++)
    int n,m,k,d;
    ll dist[N][N];//每个客户的最短距离
    vector<p> guest;//每个顾客位置 
    ll oderNum[N*N];//相应index顾客的配送餐量 
    queue<p> q;
    void bfs(){
    	while(!q.empty()){
    		p pos=q.front();
    		int x=pos.first,y=pos.second;
    		if(x>1&&dist[x-1][y]>dist[x][y]+1){
    			q.push(m_p(x-1,y));
    			dist[x-1][y]=dist[x][y]+1;
    		}
    		if(x<n&&dist[x+1][y]>dist[x][y]+1){
    			q.push(m_p(x+1,y));
    			dist[x+1][y]=dist[x][y]+1;
    		}
    		if(y>1&&dist[x][y-1]>dist[x][y]+1){
    			q.push(m_p(x,y-1));
    			dist[x][y-1]=dist[x][y]+1;
    		}
    		if(y<n&&dist[x][y+1]>dist[x][y]+1){
    			q.push(m_p(x,y+1));
    			dist[x][y+1]=dist[x][y]+1;
    		}
    		q.pop();
    	}
    }
    int main(){
    	fill(dist[0],dist[0]+N*N,N*N);
    	cin>>n>>m>>k>>d;
    	rp(i,m){
    		int x,y;
    		cin>>x>>y;
    		dist[x][y]=0;
    		q.push(m_p(x,y));
    	}
    	rp(i,k){
    		int x,y,c;
    		cin>>x>>y>>c;
    		guest.p_b(m_p(x,y));
    		oderNum[i]=c;
    	}
    	rp(i,d){
    		int x,y;
    		cin>>x>>y;
    		dist[x][y]=-1;
    	}
    	bfs();
    	ll ans=0;
    	rp(i,k) ans+=dist[guest[i].first][guest[i].second]*oderNum[i];
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    后缀数组 (Suffix Array) 学习笔记
    Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
    [ USACO 2013 OPEN ] Photo
    清华集训2016做题记录
    「UNR#2」黎明前的巧克力
    「UNR#1」奇怪的线段树
    Atcoder Grand Contest 018 E
    「NOI2015」小园丁与老司机
    「集训队作业2018」三角形
    Codeforces 878 E. Numbers on the blackboard
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308931.html
Copyright © 2011-2022 走看看