贪心算法题目 推销员

贪心题目 推销员

题目:

阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第i家住户到入口的距离为Si米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。
阿明每走1米就会积累1点疲劳值,向第i家住户推销产品会积累Ai点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

【输入格式】

    第一行为一个正整数N,表示螺丝街住户的数量。
    接下来的一行为N个正整数,其中:第i个整数Si表示第i家住户到入口的距离。数据保证S1<=S2<=…<=Sn<10^8。
    接下来的一行为N个正整数,其中:第i个整数Ai表示向第i户住户推销产品会积累的疲劳值。数据保证Ai<10^3。

【输出格式】

    输出N行,每行一个正整数,第i行整数表示当X=i时,阿明最多积累的疲劳值。                                                     

这道题

也算是

贪心题目中的极品了

毕竟

贪心题目都较为简单

这道题

还有一定的难度

不过难度其实也不算大

主要是有不少情况需要考虑

第一个直接选择最大的

后面不断选择第二大的、第三大的等等等等·····

但是有一点很重要

如果某一个最大点在上一个最大点的前面

直接加上疲劳值

如果在后面的话

更新最大值后

再加上疲劳值

为了防止混淆

前面和后面要分开算

下面是代码:

#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,a[1000][1000],z=0,b[1000],c[1000],d[1000],temp,sum=0;
	bool flag=false;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		for(int j=1;j<=i;j++) 
		{
			z++;
			cin>>a[i][j];
			b[z]=a[i][j];
			c[z]=i;
			d[z]=j;
		}
	}

	for(int i=1;i<=z-1;i++)
	{
		for(int j=i+1;j<=z;j++)
		{
			if(b[i]<b[j])
			{
				temp=b[i];
				b[i]=b[j];
				b[j]=temp;
				temp=c[i];
				c[i]=c[j];
				c[j]=temp;
				temp=d[i];
				d[i]=d[j];
				d[j]=temp;
			}
		}
	}
	for(int i=1;i<=z-1;i++)
	{
		for(int j=i+1;j<=z;j++)
		{
			if(c[i]==c[j])
			{
				sum=b[j];
				flag=true;
				break;
			}
			if(d[i]==d[j])
			{
				sum=b[j];
				flag=true;
				break;
			}
		}
		if(flag==true)
		break;
	}
	if(flag==false) cout<<"No";
	else
	{
		cout<<"Yes";
		cout<<sum<<endl;
	}
	return 0;
}

对了

还有一个重点:
二维数组要么开全局,要么用memset赋初值

发布了24 篇原创文章 · 获赞 0 · 访问量 607

猜你喜欢

转载自blog.csdn.net/zliang_ma/article/details/104628585