HDU5461-思维

来源:互联网 发布:漫画本子在淘宝怎么搜 编辑:程序博客网 时间:2024/05/29 02:37

https://vjudge.net/contest/167883#problem/L
给定一个t个数,和a,b问你最大值。。。
第一次 分了a和b 四种情况,
当a为- b为+ ,那么a取最小的t2 b取最大的t
当a为+ b为 + ,那么都取最大的
当a为+b 为-,那么a取最大的,b取最小的。
当a和b同为 –,那么都取最小的。
并且每种情况都要判断是否是相同的y,如果是相同的情况
还要测试是t2 取次小(大)还是t1取次小(大).
数组开多了,一直mle和re。。
没有看到他ac的时候。。
其实 枚举at2 和bt就行。。
当相同都取最大。
否则分别取次大找最大的,,
郁闷。

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;typedef long long ll;const int maxn=4;struct node{   long long x;  int  y;};int main(){   int t;   int n;   ll a;   node c[maxn],b[maxn];  ll  a1,b1;  node bb,cc;    scanf("%d",&t);    for(int tt=1;tt<=t;tt++){          for(int i=0;i<2;i++){     b[i].x=-1e18;     c[i].x=-1e18;   }         scanf("%d%lld%lld",&n,&a1,&b1);      for(int i=0;i<n;i++){          scanf("%lld",&a);           bb.x=a*a*a1;           bb.y=i;           if(b[0].x<bb.x){              { b[0].x=bb.x;                b[0].y=i;              }              if(b[0].x>b[1].x){                swap(b[0],b[1]);              }           }           cc.x=a*b1;           cc.y=i;         if(c[0].x<cc.x){              { c[0].x=cc.x;                c[0].y=i;              }              if(c[0].x>c[1].x){                swap(c[0],c[1]);              }           }      }      if(c[1].y!=b[1].y)        printf("Case #%d: %lld\n",tt,b[1].x+c[1].x);      else      {   long long ans=max(c[1].x+b[0].x,c[0].x+b[1].x);          printf("Case #%d: %lld\n",tt,ans);      }    }    return 0;}
原创粉丝点击