「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述
你是一只小跳蛙,你特别擅长在各种地方跳来跳去。
这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0h0=0。你估计着,从第 ii 块石头跳到第 jj 块石头上耗费的体力值为 (h_i - h_j) ^ 2(hi−hj)2,从地面跳到第 ii 块石头耗费的体力值是 (h_i) ^ 2(hi)2。
为了给小 F 展现你超级跳的本领,你决定跳到每个石头上各一次,并最终停在任意一块石头上,并且小跳蛙想耗费尽可能多的体力值。
当然,你只是一只小跳蛙,你只会跳,不知道怎么跳才能让本领更充分地展现。
不过你有救啦!小 F 给你递来了一个写着 AK 的电脑,你可以使用计算机程序帮你解决这个问题,万能的计算机会告诉你怎么跳。
那就请你——会写代码的小跳蛙——写下这个程序,为你 NOIp AK 踏出坚实的一步吧!
输入输出格式
输入格式:
输入一行一个正整数 nn,表示石头个数。
输入第二行 nn 个正整数,表示第 ii 块石头的高度 h_ihi。
输出格式:
输出一行一个正整数,表示你可以耗费的体力值的最大值。
输入输出样例
说明
样例解释
两个样例按照输入给定的顺序依次跳上去就可以得到最优方案之一。
数据范围
对于 1 \leq i \leq n1≤i≤n,有 0 < h_i \leq 10 ^ 40<hi≤104,且保证 h_ihi 互不相同。
对于 10\%10% 的数据,n \leq 3n≤3;
对于 20\%20% 的数据,n \leq 10n≤10;
对于 50\%50% 的数据,n \leq 20n≤20;
对于 80\%80% 的数据,n \leq 50n≤50;
对于 100\%100% 的数据,n \leq 300n≤300。
题解
先跳个最大的,然后跳到最小的,然后跳到没跳过的最大的,再跳到没跳过的最小的......
正确性证明:设$a>b>c>d$,则需证$(a-d)^2+(b-c)^2>(a-c)^2+(b-d)^2$
$a^2+b^2+c^2+d^2-2*a*d-a*b*c>a^2+b^2+c^2+d^2-2*a*c-2*b*d$
$a*c+b*d>b*c+a*d$
$a*(c-d)>b*(c-d)$
$a>b$
所以$(a-d)^2+(b-c)^2>(a-c)^2+(b-d)^2$
然后太懒了,所以拿了两个堆维护当前要取的最大(最小)数。
/*
qwerta
P4995 跳跳! Accepted
100
代码 C++,0.51KB
比赛 【LGR-055】洛谷11月月赛
提交时间 2018-11-04 09:07:06
耗时/内存 25ms, 788KB
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
priority_queue<int>p;
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
p.push(x);
q.push(x);
}
int bef=;
long long ans=;
for(int i=;i<=n;++i)
{
if(i&)//奇数次取大的
{
int x=p.top();
p.pop();
ans+=(x-bef)*(x-bef);
bef=x;
}
else//偶数次取小的
{
int x=q.top();
q.pop();
ans+=(x-bef)*(x-bef);
bef=x;
}
}
cout<<ans;
return ;
}
「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心的更多相关文章
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 洛谷11月月赛(284pts rank85)
https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...
- 洛谷11月月赛round.1
太感动了#2 thwfhk 240 (801ms) 100 100 40 又一张明信片,话说10月的怎么还没收到 P2246 SAC#1 - Hello World(升级版) 题目背景 一天, ...
- 洛谷11月月赛round.2
P3414 SAC#1 - 组合数 题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣 ...
- 洛谷11月月赛题解(A-C)
心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...
- NOIP模拟赛(洛谷11月月赛)
T1 终于结束的起点 题解:枚举啊... 斐波那契数 第46个爆int,第92个爆long long.... 发现结果一般是m的几倍左右....不用担心T. #include<iostream ...
- 【CSGRound2】逐梦者的初心(洛谷11月月赛 II & CSG Round 2 T3)
题目描述# 给你一个长度为\(n\)的字符串\(S\). 有\(m\)个操作,保证\(m≤n\). 你还有一个字符串\(T\),刚开始为空. 共有两种操作. 第一种操作: 在字符串\(T\)的末尾加上 ...
- 最大字段和&洛谷11月月赛DIV2 T1
蒟蒻只能打一打DIV2的基础题 太卑微了 这道题的本质其实是再建一个数组,如果s串i位置是0那么就给a[i]赋值为1,表示要累加个数,如果是1那么就把a[i]赋值为-1,表示个数减一,最后求最大子段和 ...
随机推荐
- Spark源码分析之二:Job的调度模型与运行反馈
在<Spark源码分析之Job提交运行总流程概述>一文中,我们提到了,Job提交与运行的第一阶段Stage划分与提交,可以分为三个阶段: 1.Job的调度模型与运行反馈: 2.Stage划 ...
- mnesia的脏读和事物读的测试
在mnesia中,有脏读脏写等以及事物读写,它们的差异通过测试不难发现: 代码如下: -module(mnesia_read_test). -compile(export_all). -record( ...
- mysql date函数相关用法整理(持续更新)
date_add(now(), INTERVAL 1 day) 增加一天 date_format(d,'%Y-%m-%d %T') 这里的d为datestamp类型,格式化成 yyyy-MM ...
- Grunt学习笔记【4】---- 通配符和模板
本文主要讲通配符和模板的基本使用方法. 一 通配符 通常分别指定所有源文件路径是不切实际的,因此Grunt通过内置支持node-glob 和 minimatch 库来匹配文件名(又叫作globbing ...
- python数据分析之:数据清理,转换,合并,重塑(一)
DataFrame合并: merge运算是将一个或多个键将行链接起来.来看下面的这个例子: In [5]: df1=DataFrame({'key':['b','b','a','c','a','a', ...
- ubuntu 搭建 tomcat
一.下载tomcat 先下载到本地,然后ftp上传到服务器 官方 Apache Tomcat 的下载 2 二.解压安装 先解压 tar zxvf apache-tomcat-7.0.64.tar.gz ...
- Vue-router进阶、单页面应用(SPA)带来的问题
一 . vue-router 进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二 . 单页面应用(SPA)带来的问题 1 . 虽然单页面应用有优点 , 但是,如果后端 ...
- UVA - 10305 【全排列】
题意 要求给出一组 包含 1 - N 的数字的序列 要求这个序列 满足 题给的限制条件 比如 1 2 就是 1 一定要在 2 前面 思路 因为 数据规模较小 可以用 全排列 然后判断每个序列 是否满足 ...
- Algorithm: bit manipulation
1. 一个数的从右起第p1位和第p2位swap n位 unsigned int swapBits(unsigned int x, unsigned int p1, unsigned int p2, u ...
- 【Leetcode-easy】Palindrome Number
思路:除和求余 取得首位和末尾 比较是否相等. public boolean isPalindrome(int x){ if(x<0){ return false; } int div=1; w ...