hdu 5461(分类讨论)

Largest Point

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1485    Accepted Submission(s): 588

Problem Description

Given the sequence A with n integers t1,t2,?,tn. Given the integral coefficients a and b. The fact that select two elements ti and tj of A and i≠j to maximize the value of at2i+btj, becomes the largest point.

Input

An positive integer T, indicating there are T test cases.
For each test case, the first line contains three integers corresponding to n (2≤n≤5×106), a (0≤|a|≤106) and b (0≤|b|≤106). The second line contains n integers t1,t2,?,tn where 0≤|ti|≤106 for 1≤i≤n.

The sum of n for all cases would not be larger than 5×106.

Output

The output contains exactly T lines.
For each test case, you should output the maximum value of at2i+btj.

Sample Input

2

3 2 1
1 2 3

5 -1 0
-3 -3 0 3 3

Sample Output

Case #1: 20
Case #2: 0

Source

2015 ACM/ICPC Asia Regional Shenyang Online

昨天输的很惨,中南地区邀请赛只A了两道题。所以感觉要多做少错思路题。

这个题分4种情况考虑,每种又分为三种情况。举一个例子:

a>0,b<0时

那么ti^2尽可能的大,tj尽可能的小。如果i!=j 那么直接取ti^2最大与tj最小。

如果i==j 那么在ti^2次大与tj最小和ti^2最大与tj次小中取大者。

还有就是 INF不能这样赋值 ,如1<<40 ,这个地方WA了好多次,,他会变成0

#include<stdio.h>
#include<iostream>
#include<string.h>
#include <stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL INF = 1<<60;
int main(){
    int tcase;
    scanf("%d",&tcase);
    int t =1;
    while(tcase--){
        int n,a,b;
        scanf("%d%d%d",&n,&a,&b);
        LL ans;
        if(a>=0&&b>=0){
            LL fmax = -INF,smax = -INF;
            for(int i=1;i<=n;i++){
                LL num;
                scanf("%lld",&num);
                if(num>fmax){
                    smax = fmax;
                    fmax = num;
                }else{
                    smax = max(smax,num);
                }
            }
            ans = max(a*fmax*fmax+b*smax,a*smax*smax+b*fmax);
        }else if(a>0&&b<0){
            LL MAX=-INF,SMAX=-INF; ///平方的最大和次大
            LL MIN=INF,SMIN=INF; ///最小和次小
            int id1,id2;
            for(int i=1;i<=n;i++){
                LL num;
                scanf("%lld",&num);
                LL temp = num*num;
                if(num<MIN){
                    SMIN = MIN;
                    MIN = num;
                    id1 = i;
                }else SMIN = min(SMIN,num);
                if(temp>MAX){
                    SMAX = MAX;
                    MAX  = temp;
                    id2 = i;
                }else SMAX = max(SMAX,num);
            }
            if(id1!=id2){
                ans = a*MAX+b*MIN;
            }else{
                ans = max(a*SMAX+b*MIN,a*MAX+b*SMIN);
            }
        }else if(a<0&&b>0){
            LL MAX = -INF,MIN = INF; ///注意这里的最小是指平方的最小
            LL smin=INF,smax = -INF; ///此处次小是指平方的次小
            int id1,id2; ///分别记录ti 和 tj 的位置
            for(int i=1;i<=n;i++){
                LL num;
                scanf("%lld",&num);
                if(num>MAX) {
                    smax = MAX;
                    MAX = num;
                    id1 = i;
                }else smax = max(smax,num);
                LL temp = num*num;
                if(temp<MIN){
                    smin = MIN;
                    MIN = temp;
                    id2 = i;
                }else smin = min(smin,temp);
            }
            if(id1!=id2){
                ans = a*MIN+b*MAX;
            }
            else{
                ans = max(a*MIN+b*smax,a*smin+b*MAX);
            }
        }else {
            LL MIN = INF,SMIN = INF; ///这两个值代表绝对值次小和最小的平方
            LL MIN1 = INF,SMIN1 = INF;  ///这两个值代表次小和最小
            int id1,id2;
            for(int i=1;i<=n;i++){
                LL num;
                scanf("%lld",&num);
                LL temp = num*num;
                if(num<MIN1) {
                    SMIN1 = MIN1;
                    MIN1 = num;
                    id1 = i;
                }else SMIN1 = min(SMIN1,num);

                if(temp<MIN){
                    SMIN = MIN;
                    MIN = temp;
                    id2 = i;
                }else SMIN = min(SMIN,temp);
            }
            if(id1!=id2){
                ans = a*MIN+b*MIN1;
            }else{
                ans = max(a*MIN+b*SMIN1,a*SMIN+b*MIN1);
            }
        }
        printf("Case #%d: %lld\n",t++,ans);
    }
    return 0;
}
时间: 2024-08-06 01:03:57

hdu 5461(分类讨论)的相关文章

HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点的集合,操作1:将S(u,k)内节点权值增加或者减小,操作2:查询S(u,k)内节点的权值和 题解:因为题目说了查询和更新的距离小于等于k,k最大为2,所以很显然要分情况讨论k为0.1.2的情况 因为是多次更新,我们显然是需要用线段树来维护节点权值的 运用线段树和bfs序的知识我们知道 对一个棵树求BFS

【线段树】【分类讨论】水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店

HDU 4826 (分类DP)

Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1368    Accepted Submission(s): 574 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,

dp+分类讨论 Gym 101128E

题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/details/61428924 Description n个小木条,一段前面有一个小箭头,给出第一个小木条的非箭头端端点横坐标以及每个小木条箭头端的坐标,现在要从下往上把这n'个木条按顺序叠放好,要求相邻两个小木条必须有一个共同端点且有交叠部分,问小木条有多少种放法 Input 第一行一整数n表示木条数量,之

BZOJ 1067 降雨量(RMQ+有毒的分类讨论)

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4399  Solved: 1182 [Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890, 则可以说

cf 251 B Playing with Permutations 暴力 分类讨论

题链;http://codeforces.com/problemset/problem/251/B B. Playing with Permutations time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little Petya likes permutations a lot. Recently his mom has p

BZOJ 1099([POI2007]树Drz-9次线段树&amp;分类讨论+线段树与插入顺序维护2个参数)

1099: [POI2007]树Drz Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 142  Solved: 55 [Submit][Status] Description CDQZ是一个偏远的小学校,FGD在学校里中了一排树.他却不喜欢这些树的顺序,因为他们高高矮矮显得那么参差不齐. FGD定义这些树的不整齐程度为相邻两树的高度差的和.设树高分别为h1,h2,h3,-,hn.那么不整齐程度定义为:|h1-h2|+|h2-h3|+--+|hn

POJ 2826 An Easy Problem?!(线段相交,分类讨论)

题意:给两个线段,问他们能收集到多少雨水. 链接:http://poj.org/problem?id=2826 解法:分四种情况讨论 1. 存在一个线段与x轴平行,答案为0 2. 两个线段没有交点,答案为0 3. 1和2都不满足时,令线段1为比较低的那个线段,且p1为其比较高的那个点,若该点往y轴正方向的射线与线段2有交点,则答案为0 4. 3不满足时,求出两线段交点x1,p1做一条平行于x轴的线,该线与线段2的交点x2,则三角形x1, x2, p1的面积就是答案 小结:此题属于分类讨论型的题,

Codeforces 460D Little Victor and Set --分类讨论+构造

题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四个数(L,L+1,L+2,L+3),这样的话(L^(L+1)) ^ ((L+2)^(L+3)) = 0,最优 如果L不是偶数,那么看从L+1到R有没有四个数,如果有则取该四个数,否则最小异或和达不到0,也达不到1了,不再考虑k=4,k=3时还有可能等于0,所以转到k=3 2. k=3时,要使异或和为0,那