zoukankan      html  css  js  c++  java
  • 【贪心】Gym

    题意:一个邮递员从数轴上原点出发,每次最多带K封信,往n个地方送信,每个地方有一定的需求的信件数,问你最少要跑的距离的总和是多少?一趟可以给多个地方去送。

    显然优先往远的地方送比较优越,近的地方可以顺路给他带过去。

    原点两侧是独立的,可以分别处理。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int Abs(int x){
    	return x<0 ? (-x) : x;
    }
    typedef pair<int,int> Point;
    typedef long long ll;
    ll ans;
    int n,K;
    Point p[1005];
    int main(){
    //	freopen("i.in","r",stdin);
    	scanf("%d%d",&n,&K);
    	for(int i=1;i<=n;++i){
    		scanf("%d%d",&p[i].first,&p[i].second);
    	}
    	sort(p+1,p+n+1);
    	int now=0;
    	for(int i=1;p[i].first<0;++i){
    		if(p[i].second<=now){
    			now-=p[i].second;
    		}
    		else{
    			p[i].second-=now;
    			ans+=(ll)(p[i].second/K+(p[i].second%K!=0))*(ll)Abs(p[i].first)*2ll;
    			if(p[i].second%K!=0){
    				now=K-p[i].second%K;
    			}
    			else{
    				now=0;
    			}
    		}
    	}
    	now=0;
    	for(int i=n;p[i].first>0;--i){
    		if(p[i].second<=now){
    			now-=p[i].second;
    		}
    		else{
    			p[i].second-=now;
    			ans+=(ll)(p[i].second/K+(p[i].second%K!=0))*(ll)Abs(p[i].first)*2ll;
    			if(p[i].second%K!=0){
    				now=K-p[i].second%K;
    			}
    			else{
    				now=0;
    			}
    		}
    	}
    	printf("%I64d
    ",ans);
    	return 0;
    }
  • 相关阅读:
    Java正則表達式入门
    Effect of Switchovers, Failovers, and Control File Creation on Backups
    Android 屏幕截图(底层实现方式)
    Java实现奇偶数排序
    Java实现奇偶数排序
    Java实现奇偶数排序
    Java实现找零问题
    Java实现找零问题
    Java实现找零问题
    Java实现找零问题
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7634856.html
Copyright © 2011-2022 走看看