HDU 2615
做法:好好读题!!!。当时晚上做的,完全不知道在写什么。
首先第一刀切任何地方都有可能, 所以先暴力枚举第一刀。
而第二刀就不同了,这里第二个人是有智慧的,会切一刀使他得到的最大,只需要在第一重循环下开一个maxtwo变量即可,同时当答案相同时,第三个人取最小答案。
wa点 第二刀枚举的时候应该在第一刀的左右都要枚举。
n很小,只要读懂题就可以暴力过
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
ll val[105];
int n;
ll sum[105];
ll fx(ll a, ll b, ll c)
{
return (a+b+c) - max(a,max(b,c)) - min(a,min(b,c));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;++i) scanf("%I64d",&val[i]);
sum[0]=0; for(int i=1;i<=n;++i) sum[i] =sum[i-1] + val[i];
ll Ans=0;
for(int i=1;i<=n-1;++i)
{
ll three=0;
ll two=0;
for(int j=i+1;j<=n-1;++j)
{
if(i==j) continue;
ll temp1 = sum[i] ;
ll temp2 = sum[j] - sum[i];
ll temp3 = sum[n] - sum[j];
ll x=fx(temp1, temp2, temp3);
ll mi =min(temp1 , min(temp2 , temp3));
if(x>two) { three=mi; two=x;}
else if(x==two && mi< three) three=mi;
}
for(int j=1;j<=i;++j)
{
if(i==j) continue;
ll temp1 = sum[j] ;
ll temp2 = sum[i] - sum[j];
ll temp3 = sum[n] - sum[i];
ll x=fx(temp1, temp2, temp3);
ll mi =min(temp1 , min(temp2 , temp3));
if(x>two) { three=mi; two=x;}
else if(x==two && mi< three) three=mi;
}
Ans= max(three,Ans);
}
printf("%I64d\n",Ans);
}
return 0;
}