蓝桥杯_倍数问题_stack_求余

//
#include<bits/stdc++.h>
using namespace std;

const int N=1111;
int in[N*N];

int main()
{
    int n,k,i,j,ans,re,tt,t1,t2;

    while( cin>>n>>k )
    {
        for( i=0;i<n;i++ ) cin>>in[i];
        sort( in,in+n );

        stack<int> sk[N];
        for( i=0;i<n;i++ ) sk[ in[i]%k ].push( in[i] );
        
        ans=0;
        for( i=0;i<k;i++ )
        {
            if( sk[i].empty() ) continue;
            for( j=i;j<k;j++ )
            {
                if( sk[j].empty() ) continue;

                re=( k-i+k-j )%k;
                if( re<j || sk[re].empty() ) continue;      // 之前的遍历过

                // tt=sk[i].top()+sk[j].top()+sk[re].top(); 
                // i==j==re
                tt=0;
                if( !sk[i].empty() )
                {
                    t1=sk[i].top(); sk[i].pop(); tt+=t1;
                    if( !sk[j].empty() )
                    {
                        t2=sk[j].top(); sk[j].pop(); tt+=t2;
                        if( !sk[re].empty() )
                        {
                            tt+=sk[re].top();
                            ans=max( ans,tt );
                        }
                        sk[j].push( t2 );
                    }
                    sk[i].push( t1 );
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125166839