题目链接:https://ac.nowcoder.com/acm/contest/243/A

题目大意:

  略

分析:

  方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i >= 2)个时有2种取法:一是取,那么X = i的答案就是[n-i+1,n]区间的疲劳值求和并加上其中最大距离的2倍;二是不取,那么答案便是[n-i+2,n]区间的疲劳值求和并加上[1,n-i]区间中(疲劳值+距离的2倍)最大的一个,为什么一定是前面那个最大?因为如果最大距离在[n-i+2,n]中,那显然是选取n-i的地方更增加疲劳值。2种取法取个最大即可。
  最大的疑问是,为什么X=i时的最优解一定是建立在[n-i+2,n]区间中的数全部取完之后呢?
证明如下:
  当i = 2时,第n个数是必取的,可以用反证法证明:假设取第x,y(x<y<n)个数时疲劳值最大,于是可以将其中一个不对距离贡献疲劳值的数换成第n个数,这样,无论最大距离是否更新,都出现了一个更优的解,与假设矛盾。
  当i > 2时,也可以用反证法证明:假设在[n-i+2,n]中取m(m<i)个数,在[1,n-i+1]中取i-m个数的组合才是最优的。可以分2种情况:(1)最大距离在[1,n-i+1]区间中,那么[1,n-i+1]区间非最大距离的数都可以用[n-i+2,n]中的数代替,显然可以有更优的解。(2)最大距离在[n-i+2,n]区间中,显然这i个数全部选后i个数是最优的,因为前面的数不对距离有所贡献。综上,与假设矛盾。

代码如下:

 #include <bits/stdc++.h>
using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i)
#define For(i,s,t) for (int i = (s); i <= (t); ++i)
#define rFor(i,t,s) for (int i = (t); i >= (s); --i)
#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
#define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) #define pr(x) cout << #x << " = " << x << " "
#define prln(x) cout << #x << " = " << x << endl #define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin()) #define ms0(a) memset(a,0,sizeof(a))
#define msI(a) memset(a,inf,sizeof(a)) #define pii pair<int,int>
#define piii pair<pair<int,int>,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second inline int gc(){
static const int BUF = 1e7;
static char buf[BUF], *bg = buf + BUF, *ed = bg; if(bg == ed) fread(bg = buf, , BUF, stdin);
return *bg++;
} inline int ri(){
int x = , f = , c = gc();
for(; c<||c>; f = c=='-'?-:f, c=gc());
for(; c>&&c<; x = x* + c - , c=gc());
return x*f;
} typedef long long LL;
const int maxN = 1e5 + ; int n;
int dist[maxN], cost[maxN];
int suffixMax[maxN]; //记录dist的后缀最大值
int f[maxN]; // f[i]表示当X=1时在1~i范围内只选择1家住户的最优解
int prefixSum[maxN]; // cost的前缀和 int getSum(int x, int y){
return x < y ? prefixSum[y] - prefixSum[x] : ;
} void mergeSort(int l, int r){
if(l >= r) return;
int mid = (l+r) >> ; mergeSort(l, mid);
mergeSort(mid+, r); int tmp1[r-l+], tmp2[r-l+];
int i = l, j = mid + , k = ; while(i <= mid && j <= r){
if(cost[i] > cost[j] || cost[i] == cost[j] && dist[i] > dist[j]){
tmp1[k] = cost[j];
tmp2[k++] = dist[j++];
}
else{
tmp1[k] = cost[i];
tmp2[k++] = dist[i++];
}
}
while(i <= mid){
tmp1[k] = cost[i];
tmp2[k++] = dist[i];
++i;
}
while(j <= r){
tmp1[k] = cost[j];
tmp2[k++] = dist[j];
++j;
} rep(i, k){
cost[i+l] = tmp1[i];
dist[i+l] = tmp2[i];
}
} int main(){
scanf("%d", &n);
For(i, , n) dist[i] = ri();
For(i, , n) cost[i] = ri(); mergeSort(, n);
rFor(i, n, ) suffixMax[i] = max(suffixMax[i+], dist[i]); For(i, , n) f[i] = max(f[i-], cost[i] + dist[i]*); For(i, , n) prefixSum[i] = prefixSum[i-] + cost[i]; rFor(i, n, ) printf("%d\n", max(getSum(i, n) + f[i], getSum(i-, n) + *suffixMax[i]));
return ;
}

NOIP2015普及组复赛A 推销员的更多相关文章

  1. NOIP2015普及组总结

    NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...

  2. NOIP2018普及组复赛游记

    2018年11月10日,NOIP2018普及组复赛. 这是我初中阶段最后一次复赛了. 和往常一样,我们在预定的早上7点,没有出发. 10分钟之后,人终于到齐了,于是出发了,一路无话. 到了南航,合照三 ...

  3. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  4. [NOIP2015 普及组] 扫雷游戏

    [NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...

  5. NOIP2015普及组第四题推销员

    好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...

  6. NOIP2016普及组复赛解题报告

    提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...

  7. 洛谷-神奇的幻方-NOIP2015提高组复赛

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  8. 洛谷【P2669】NOIP2015普及组 T1金币

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...

  9. 【NOIP2015普及组】推销员_详解

    题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...

随机推荐

  1. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  2. Java开发笔记(四十九)关键字super的用法

    前面介绍了如何从Bird类继承而来Swallow类,按道理子类应当继承父类的所有要素,但是对于构造方法来说,Swallow类仅仅继承了Bird类的默认构造方法,并未自动继承带参数的构造方法.如果子类想 ...

  3. 【Linux】常用命令,持续更新

    Linux 一.linux的组成 内核,shell,文件系统,应用程序 二.linux目录结构 bin,sbin,home,root,boot,dev,etc,lib, 三.文件目录操作 ls,cd, ...

  4. RESTful api风格介绍

    RESTful 接口是目前来说比较流行的一种接口,平常在开发中会非常常见. 有过和后端人员对接接口的小伙伴都应该知道,我们所做的大多数操作都是对数据库的四格操作 “增删改查” 对应到我们的接口操作分别 ...

  5. Dynamics 365 POA表记录的查询

    微软动态CRM专家罗勇 ,回复313或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . PrincipalO ...

  6. 如何在vue单页应用中使用百度地图

    作为一名开发人员,每次接到开发任务,我们首先应该先分析需求,然后再思考技术方案和解决方案.三思而后行,这是一个好的习惯. 需求:本项目是采用vue组件化开发的单页应用项目,现需要在项目中引入百度的地图 ...

  7. 环境设置——pyCharm环境下导入MySQLdb遇到的一系列问题

    本文转自http://blog.sina.com.cn/s/blog_135031dae0102yc8l.html 安装好pyCharm后想要import MySQL,结果发现了一系列问题,像推到了塔 ...

  8. MySQL 处理海量数据时的一些优化查询速度方法

    查询速度慢的原因 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O 吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6 ...

  9. tofixed方法 四舍五入

    tofixed方法 四舍五入 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的 ...

  10. PYTHON常用数据类型(列表,元组,字典)

    一.数字 1.整形:就是整数. 2.浮点型:就是小数. 3.布尔型:True或者是False,python里严格区分格式,空格缩进或者是大小写. 4.运算符有+ – * / ()%(求模运算取余数)* ...