传送

很抱歉之前用错误的思路写了一篇题解ρωρ

先说一下之前的思路。

对于每个住户,求出它的s[i]*2+a[i],寻找最大的住户m,然后按照a排序,如果m在前x大的住户里面,就选择前x大的住户,从中选择最大的s,计算答案。否则选择权值前x-1大的住户和m。

but这个是错的!!!!

hack数据:

3

1 5 6

3 5 2

正确答案:15 19 22

上述思路的答案:15 18 22

第二个按照上述思路的选法:选择第1,2户。

正解选法:选择第2,3户。

错误思路的代码:

#include<bits/stdc++.h>
using namespace std;
int n,sum[],ma[];
struct zh{
int bh,l,p,q;
}r[];
int read()
{
char ch=getchar();
int x=;bool f=;
while(ch<''||ch>'')
{
if(ch=='-')f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
f?x=-x:x=x;
return x;
}
bool cmp1(zh a,zh b)
{
return a.p>b.p;
}
int main()
{
int maxn=,maxi;
n=read();int m;
for(int i=;i<=n;i++)
r[i].l=read(),r[i].bh=i;
for(int i=;i<=n;i++)
{
r[i].p=read();
r[i].q=r[i].l*+r[i].p;
if(r[i].q>maxn)
maxn=r[i].q,maxi=r[i].bh;
}
m=r[n].l;
sort(r+,r++n,cmp1);
for(int i=;i<=n;i++)
sum[i]=sum[i-]+r[i].p,ma[i]=max(ma[i-],r[i].l);
int mi;
for(int i=;i<=n;i++)
{
if(r[i].bh==maxi)
{
mi=i;
break;
}
}
printf("%d\n",maxn);
for(int i=;i<n;i++)
{int ren=,lu=r[mi].l*;
if(mi<=i)
{
ren=sum[i];
if(ma[i]>r[mi].l)lu=ma[i]*;
int ans=ren+lu;
printf("%d\n",ans);
}
else
{ ren=r[mi].p+sum[i-];
if(ma[i-]>r[mi].l)lu=ma[i-]*;
int ans=ren+lu;
printf("%d\n",ans);
}
}
int ans=;
for(int i=;i<=n;i++)
ans+=r[i].p;
ans+=m*;
printf("%d\n",ans);
}

它是个错的QAQ

正确的思路是什么鸭?窝也不会鸭~来让我们仔(fan)细(fan)思(ti)考(jie)

先来说一下上面的思路错在哪里。

上面对于每个x,都有一种确定的方案(选前x个或者选前x-1个)。但是我们不知道另一种方案是否比我们确定的这个方案要优。

所以我们把上面的两种选法比较一下。

先按照a从大到小排序

用qaq[i]来记录后i个住户里面最大的a[i]+s[i]*2(排序后),sum[i]是排序后的前缀和,ma[i]是排序后前i个中的最大的s,则ansi=max(sum[x]+ma[i]*2,sum[x-1]+qaq[x])

为什么qaq是记录后i个住户的信息呢?

因为后i个住户的a会小,但是s可能会很大。这里是考虑s对ans的影响

代码:

#include<bits/stdc++.h>
using namespace std;
int n,sum[],ma[],qaq[];
struct zh{
int bh,l,p,q;
}r[];
int read()
{
char ch=getchar();
int x=;bool f=;
while(ch<''||ch>'')
{
if(ch=='-')f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
f?x=-x:x=x;
return x;
}
bool cmp1(zh a,zh b)
{
return a.p>b.p;
}
int main()
{
int maxn=,maxi;
n=read();int m;
for(int i=;i<=n;i++)
r[i].l=read(),r[i].bh=i;
for(int i=;i<=n;i++)
{
r[i].p=read();
r[i].q=r[i].l*+r[i].p;
if(r[i].q>maxn)
maxn=r[i].q,maxi=r[i].bh;
}
m=r[n].l;
sort(r+,r++n,cmp1);
for(int i=;i<=n;i++)
sum[i]=sum[i-]+r[i].p,ma[i]=max(ma[i-],r[i].l);
qaq[n]=r[n].l*+r[n].p;
for(int i=n-;i>=;i--)
qaq[i]=max(qaq[i+],r[i].l*+r[i].p); printf("%d\n",maxn);
for(int i=;i<n;i++)
{
int ans=max(sum[i]+ma[i]*,sum[i-]+qaq[i]);
printf("%d\n",ans);
}
int ans=;
for(int i=;i<=n;i++)
ans+=r[i].p;
ans+=m*;
printf("%d\n",ans);
}

它终于对了

P2672推销员的更多相关文章

  1. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  2. P2672 推销员(已经补锅)

    P2672 推销员 下面讲正确的贪心 题解 考虑当推销员要推销 i 家客户时,他可以有两种选择: (1)选择前 i 家疲劳值 a 最大的客户,加上这些客户里最远的距离 (2)选择前 i-1 家疲劳值 ...

  3. luogu P2672 推销员 |贪心

    题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第ii家住户到入口的距离为Si米.由于同一栋 ...

  4. 洛谷P2672 推销员 题解 贪心

    题目链接:https://www.luogu.org/problem/P2672 这道题目是贪心,贪心的思想是: 选择 \(m\) 户人家的最大疲劳值应该是以下两种方案中的较大值: 方案一:选择 \( ...

  5. P2672 推销员

    贪心,水题 #include <bits/stdc++.h> using namespace std; const int maxn = 1000000; struct house { i ...

  6. 洛谷P2672 推销员

    沙雕贪心...... 我一开始想的是倒着来,每次减去一个. 然后我们就有两个决策:去掉最后一个/去掉前面某一个. 然后第一个决策用并查集维护,第二个决策用线段树即可.仔细想想觉得普及组不会考这种东西, ...

  7. P2672 推销员 优先队列 + 贪心

    ---题面--- 题解: 我会说我想这道普及组题都想了好久么.... 不熟练的普及组选手.jpg 最后随便猜了一个结论居然是对的... 放结论: 假设x = i的最优决策为f[i], 那么f[i + ...

  8. 洛谷 P2672 推销员

    题目传送门 解题思路: 我们会发现本题有一个特性,就是如果我们走到一个更远的地方,那么近的地方距离原点的距离我们可以忽略. 本题要求最大的疲劳值,所以我们需要排序,第一个想到堆,反正我是先想到堆. 然 ...

  9. 洛谷p2672推销员题解

    日常扯废话: 话说题解里的思路都写得真的是很奈斯啊 但是 代码看不懂确实让人头疼(可能是我太弱了) 就像题解里的第一篇题解代码简洁但是属实看不明白 趁着学姐刚给我讲了知识还热乎赶紧给泥萌说说哈 正文: ...

  10. 洛谷 P2672 推销员(贪心,模拟)

    传送门 解题思路 第一种: 对于选i家,很显然,a值前i-1家的一定会选,所以只需要考虑最后一家的选法.要么是选择a值第i大的(就不管s了),要么选择剩下的中s最大的. 我们把每一家的情况(s和a)存 ...

随机推荐

  1. 浅谈vue$router 和 $route的区别

    最近在学习vue的单页面应用开发,需要vue全家桶,其中用到了VueRouter,在路由的设置和跳转中遇到了两个对象$router 和 $route ,有些傻傻分不清,后来自己结合网上的博客和自己本地 ...

  2. C#异步:AsyncCallback和IAsyncResult

    在线程池异步的执行委托,异步编程模型 msdn官方解释:https://msdn.microsoft.com/zh-cn/library/ms228972(VS.80).aspx 使用AsyncCal ...

  3. hdu-1281.棋盘游戏(二分图匹配 + 二分图关键点查询)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. 高性能JavaScript模板引擎实现原理详解

    这篇文章主要介绍了JavaScript模板引擎实现原理详解,本文着重讲解artTemplate模板的实现原理,它采用预编译方式让性能有了质的飞跃,是其它知名模板引擎的25.32 倍,需要的朋友可以参考 ...

  5. 本地SVN服务器的搭建(WINDOWS环境)

    1.下载安装 VISUALSVN SERVER 1.1下载地址:https://www.visualsvn.com/server/download/ 1.2下载完成后,双击安装. 2.下载安装 Tor ...

  6. Codeforces 979D (STL set)(不用Trie简单AC)

    题面: 传送门 题目大意: 给定一个空集合,有两种操作: 一种是往集合中插入一个元素x,一种是给三个数x,k,s,问集合中是否存在v,使得gcd(x,v)%k==0,且x+v<=s若存在多个满足 ...

  7. 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)

    转载自:http://ued.ctrip.com/blog/how-browsers-work-rendering-engine-html-parsing-series-ii.html 渲染引擎 渲染 ...

  8. Apache Mesos1.0.1 编译安装部署教程(ubuntu)

    参考资料 官方文档:http://mesos.apache.org/documentation 中文翻译:http://mesos.mydoc.io/ GitHub:https://github.co ...

  9. 基于Xilinx Kintex-7 XC7K325T 的FMC USB3.0 SATA 四路光纤数据转发卡

    基于Xilinx Kintex-7 XC7K325T 的FMC USB3.0 SATA 四路光纤数据转发卡 1. 板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...

  10. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...