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;
    }
    
  • 相关阅读:
    Matplotlib API汉化 Pyplot API
    Pycharm2018的激活方法或破解方法
    优化器
    泛化能力,欠拟合,过拟合,不收敛和奥卡姆剃刀原则
    sas9.2 windows7系统 10年11月后 建立永久数据集时,提示:“用户没有与逻辑库相应的授权级别
    Json、JavaBean、Map、XML之间的互转
    19年博文
    Java demo之时间
    idea相关
    shell脚本
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308930.html
Copyright © 2011-2022 走看看