贪心题目 推销员
题目:
阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有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赋初值