题解 P6437 【[COCI2011-2012#6] JACK】

· · 题解

思路:

这道题目直接用暴力循环就可以解决了。可以排序优化,假设位置是i,这些数是a,如果:

a_i+a_{i+1}+a_{i+2}>m

就说明这个方案以后的方案都不可行,已经排过序了,后面的只会更大。

代码:

#include <bits/stdc++.h>//头文件
using namespace std;
int n,m,a[1005],ans=0;//先把答案置零
int main()
{
    cin>>n>>m;//输入
    for(int i=1;i<=n;i++)//循环输入
    {
        cin>>a[i];//输入a
    }
    sort(a+1,a+n+1);//排序
    for(int i=1;i<=n;i++)//循环
    {
        if(a[i]+a[i+1]+a[i+2]>m)//如果当前加上下一个和下一个的下一个大于m的话
        {
            break;//就结束循环
        } 
        for(int j=i+1;j<=n;j++)//循环
        {
            if(a[i]+a[j]+a[j+1]>m)//如果最小的情况大于m
            {
                break;//就结束循环
            }
            for(int k=j+1;k<=n;k++)//循环
            {
                if(a[i]+a[j]+a[k]>m)//如果当前大于m
                {
                    break;//结束循环
                }
                ans=max(a[i]+a[j]+a[k],ans);//更新最大值
            }
        }
    }
    cout<<ans;//输出
    return 0;//别忘了
}

谢谢观看,希望大家能看懂