HDU5461 Largest Point 贪心
2015-09-20 11:02
176 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5461
题目大意:给出一个数组t0,t1,...,tn-1,和整数a,b,找出a*ti^2+b*tj(i!=j)的最大值。
分析:对于数组中的每一个t,我们用两个数组A和B分别纪录a*ti^2和b*ti,然后对这两个数组排序,如果两个数组最大值的下标不同,那么相加就是最大值了,如果相同,那么就拿A数组的次大值加上B数组的最大值,和A数组的最大值加上B数字的次大值这两个值相比较,较大的即为最终的最大值。
实现代码如下:
题目大意:给出一个数组t0,t1,...,tn-1,和整数a,b,找出a*ti^2+b*tj(i!=j)的最大值。
分析:对于数组中的每一个t,我们用两个数组A和B分别纪录a*ti^2和b*ti,然后对这两个数组排序,如果两个数组最大值的下标不同,那么相加就是最大值了,如果相同,那么就拿A数组的次大值加上B数组的最大值,和A数组的最大值加上B数字的次大值这两个值相比较,较大的即为最终的最大值。
实现代码如下:
#include <cstdio> #include <algorithm> #include <iostream> using namespace std; const int maxn=5e6+10; int n,a,b; struct node { int id; long long x; bool operator <(const node &a) const { return x<a.x; } }A[maxn],B[maxn]; int max(int x,int y) { return x>y?x:y; } int main() { int t,T=1; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&a,&b); for(int i=0;i<n;i++) { long long v; scanf("%I64d",&v); A[i].x=a*v*v; B[i].x=b*v; A[i].id=B[i].id=i; } sort(A,A+n); sort(B,B+n); printf("Case #%d: ",T++); if(A[n-1].id!=B[n-1].id) { printf("%I64d\n",A[n-1].x+B[n-1].x); continue; } printf("%I64d\n",max(A[n-1].x+B[n-2].x,A[n-2].x+B[n-1].x)); } return 0; }
相关文章推荐
- 计算机网络之路由器与分组交换
- quartznet笔记
- 用CSS3制作的旋转六面体动画
- 大数据笔记10:大数据之Hadoop的MapReduce的原理
- 自动释放池嵌套的简单图解
- netbeans实现登陆界面
- 日经春秋 20150920
- Tomcat详细用法学习(五)
- c++反汇编学习笔记----------3.流程控制
- 一步一步实现500px引导动画
- iOS开发工具-网络封包分析工具Charles
- LSTM和RNN 入门tutorials
- 【软件工程】第一章概述
- Vim 快捷键整理
- 打开相册另类写法
- 检查 CPU 是否支持二级地址转换 - 摘自网络
- netbeans实现计算器代码
- LoadRunner的-26612报错解决过程(参数化错误)
- 【初谈软件工程】
- 路总会走完