P2672 推銷員

題目描述

阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死衚衕,出口與入口是同一個,街道的一側是圍牆,另一側是住戶。螺絲街一共有N家住戶,第iii家住戶到入口的距離爲Si​米。由於同一棟房子裏可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的X家住戶推銷產品,然後再原路走出去。

阿明每走1米就會積累1點疲勞值,向第iii家住戶推銷產品會積累Ai​點疲勞值。阿明是工作狂,他想知道,對於不同的X,在不走多餘的路的前提下,他最多可以積累多少點疲勞值。

輸入輸出格式

輸入格式:

 

第一行有一個正整數N,表示螺絲街住戶的數量。

接下來的一行有N個正整數,其中第i個整數Si表示第i家住戶到入口的距離。數據保證S_1≤S_2≤…≤S_n<10^8。

接下來的一行有N個正整數,其中第i個整數Ai​表示向第iii戶住戶推銷產品會積累的疲勞值。數據保證Ai<1000。

輸出式:

輸出N行,每行一個正整數,第i行整數表示當X=i時,阿明最多積累的疲勞值。

 

輸入輸出樣例

輸入樣例#1: 複製

5
1 2 3 4 5
1 2 3 4 5

輸出樣例#1: 複製

15
19
22
24
25

 先按照A的值排序,找出x=1的那個,即t=2*d[i].len+d[i].val 最大的那個,然後根據這個index分爲前後兩個部分分別處理!

#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define Max 100010
typedef struct node {
	int len;
	int val;
	int id;
} node;
vector<node> d;
int n;
inline int read() {
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-')f=-f;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}

bool mycmp(node a,node b) {
	if(a.val!=b.val) return a.val>b.val;
	else  return a.len<b.len;
}
bool vist[100001];
int main() {
	bool mycmp(node a,node b);
	cin>>n;
	int t;
	d.resize(n);
	memset(vist,0,sizeof(vist));
	for(int i=0; i<n; i++) {
		//scanf("%d",&d[i].len);
		d[i].len=read();
	}
	for(int i=0; i<n; i++) {
		//scanf("%d",&d[i].val);
		d[i].val=read();
		d[i].id=i;
	}
	sort(d.begin(),d.end(),mycmp);
	long long imax=0;
	int maxid=0;
	for(int i=0; i<n; i++) {
		t=2*d[i].len+d[i].val;
		if(imax<t) {
			imax=t;
			maxid=i;
		}
	}
	vist[maxid]=true;
	cout<<imax<<endl;
	int p1=0;
	while(vist[p1]) p1++;
	int p2=maxid;

	for(int i=1; i<n; i++) {
		while(vist[p1]) p1++;
		int d1=d[p1].val;
		int d2=0,d2index;
		for(int j=p2; j<n; j++) {
			if(vist[j]==false&&d[j].id>d[maxid].id&&
			        d2<(d[j].len-d[maxid].len)*2+d[j].val) {
				d2=(d[j].len-d[maxid].len)*2+d[j].val;
				d2index=j;
			}
		}
		if(d1>=d2) {
			imax=imax+d1;
			vist[p1]=true;
		} else {
			imax=imax+d2;
			maxid=d2index;
			vist[d2index]=true;
			p2=d2index;
		}
		cout<<imax<<endl;
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章