2018CCPC桂林 A(贪心,思维)
分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案。一开始我是想先按这种方式进行合并,然后将最后未合并完的剩余数组元素向前推进插值,维护一个双端队列保存推进元素块的信息,借此更新答案,但写到一半想到了反例,又想了想感觉没有解决的办法,原因在于这种方式过于局部,很难顾及全局。如果要合并的两个数组原本就是单调不增序列那按照一开始的想法直接比较两数组元素大小进行合并就好了,这样最终答案是正确的。此时就可以开始乱想,如果想到平均值就好办了,通过类似单调栈的方式将原本数组划分为多个区块,满足区块的平均值单调不增,然后就可以按照一开始的想法合并数组了。然后我们大致证明一下可以感觉到这样最优的,即不存在交换两个元素使结果优于以这种方式合并数组的答案。
#include<cstdio>
#include<algorithm>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int N = 1e5 + 50;
int T, n, m;
int a[N], b[N], c[N << 1], id[N << 1];
pair<ll, int> da[N], db[N];
int main(){
scanf("%d", &T);
for(int ca = 1; ca <= T; ++ca){
ll ans = 0;
int len_a = 0, len_b = 0, x = 1, y = 1, tot = 0, dx = 0, dy = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]); da[++len_a] = {a[i], 1};
while(len_a > 1 && da[len_a].fi * da[len_a - 1].se > da[len_a - 1].fi * da[len_a].se){
--len_a;
da[len_a] = {da[len_a].fi + da[len_a + 1].fi, da[len_a].se + da[len_a + 1].se};
}
}
for(int i = 1; i <= m; ++i){
scanf("%d", &b[i]); db[++len_b] = {b[i], 1};
while(len_b > 1 && db[len_b].fi * db[len_b - 1].se > db[len_b - 1].fi * db[len_b].se){
--len_b;
db[len_b] = {db[len_b].fi + db[len_b + 1].fi, db[len_b].se + db[len_b + 1].se};
}
}
while(x <= len_a && y <= len_b){
if(da[x].fi * db[y].se < db[y].fi * da[x].se){
for(int i = 1; i <= db[y].se; ++i){
++tot;
ans += 1LL * b[dy + i] * tot;
}
dy += db[y++].se;
}
else{
for(int i = 1; i <= da[x].se; ++i){
++tot;
ans += 1LL * a[dx + i] * tot;
}
dx += da[x++].se;
}
}
while(x <= len_a){
for(int i = 1; i <= da[x].se; ++i){
++tot;
ans += 1LL * a[dx + i] * tot;
}
dx += da[x++].se;
}
while(y <= len_b){
for(int i = 1; i <= db[y].se; ++i){
++tot;
ans += 1LL * b[dy + i] * tot;
}
dy += db[y++].se;
}
printf("Case %d: %lld\n", ca, ans);
}
return 0;
}
2018CCPC桂林 A(贪心,思维)的更多相关文章
- Mike and distribution CodeForces - 798D (贪心+思维)
题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- 贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas
题目传送门 /* 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0 ...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...
- T - Posterized(贪心思维)
Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...
- 2018CCPC桂林站JStone Game
题目描述 Alice and Bob are always playing game! The game today is about taking out stone from the stone ...
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 C.二元-K个二元组最小值和最大-优先队列+贪心(思维)
链接:https://ac.nowcoder.com/acm/contest/558/C来源:牛客网 小猫在研究二元组. 小猫在研究最大值. 给定N个二元组(a1,b1),(a2,b2),…,(aN, ...
- 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心
https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...
- C. Coffee Break 贪心 思维 有点难 有意思
C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...
- hdu 4803 贪心/思维题
http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么? G++ AC C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...
随机推荐
- 《Pro Git》Git基础笔记
获取Git仓库 在已存在目录中初始化仓库 $ git init 该命令会创建一个名为.git的隐藏文件. 克隆现有的仓库 $ git clone <url> # 例如 git clone ...
- IDA函数特征识别自动签名
IDA函数特征识别自动签名 Vc6编译的有些无法识别一些库里面的函数 测试代码 #include <stdio.h> int main() { printf("123456\n& ...
- elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引
search_as_you_type字段类型用于自动补全,当用户输入搜索关键词的时候,还没输完就可以提示用户相关内容.as_you_type应该是说当你打字的时候.它会给索引里的这个类型的字段添加一些 ...
- python flask 简单应用开发
转载请注明出处: Flask 是一个基于 Python 的微型 Web 框架,它提供了一组简洁而强大的工具和库,用于构建 Web 应用程序.Flask 的主要作用是帮助开发者快速搭建轻量级的.灵活的 ...
- 全局多项式(趋势面)与IDW逆距离加权插值:MATLAB代码
本文介绍基于MATLAB实现全局多项式插值法与逆距离加权法的空间插值的方法,并对不同插值方法结果加以对比分析. 目录 1 背景知识 2 实际操作部分 2.1 空间数据读取 2.2 异常数据剔除 2 ...
- elasticsearch wildcard 慢查询原因分析(深入到源码!!!)
大家好,我是蓝胖子,前段时间线上elasticsearch集群遇到多次wildcard产生的性能问题, elasticsearch wildcard 一直是容易引发elasticsearch 容易宕机 ...
- Git命令详细使用指南
Git命令详细使用指南 Git是一种广泛使用的版本控制系统,它可以帮助开发人员跟踪变更.协作项目和有效管理代码仓库.无论你是初学者还是有经验的用户,理解各种Git命令对于高效的代码管理至关重要. 安装 ...
- 从驾考科目二到自动驾驶,聊聊GPU为什么对自动驾驶很重要
"下一个项目,坡道起步." -- "考试不合格,请将车子开到起点,重新验证考试.你的扣分项是:起步时间超30秒:扣100分.行驶过程中车轮轧到边线:扣100分." ...
- 看完这篇HTTP,跟面试官扯皮就没问题了(转)
认识 HTTP 首先你听的最多的应该就是 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),这你一定能说出来,但是这样还不够,假如你是大厂面试官,这不可能是他 ...
- 模块化打包工具-初识Webpack
1. 为什么需要模块化打包工具 在上一篇文章中提到的ES Module可以帮助开发者更好地组织代码,完成js文件的模块化,基本解决了模块化的问题,但是实际开发中仅仅完成js文件的模块化是不够的,尤其是 ...