LQB2018A09倍数问题

 这个题,第一反应一定是三个for嵌套加一个max比较.

 超级无敌大暴搜

#include <iostream>
#include <string>
#include <string.h>
using namespace std;
long MAX=0;
int main(){
    long m[10000+2];

    int n,K;
    cin>>n>>K;
    for (int i = 0; i < n; ++i) {
        cin>>m[i];

    }
    for (int j = 0; j < n; ++j) {
        for (int i = j + 1; i < n; ++i) {
            for (int k = i + 1; k < n; ++k) {
                if ((m[j]+m[k]+m[i])%K==0 && (MAX<m[j]+m[i]+m[k]) ){
                    
                    MAX=m[j]+m[i]+m[k];
                }

            }

        }

    }
    cout<<MAX;

}
/*
*这是官方题解,但是我觉得有点问题,我会再改一下的
*/


#include <iostream> #include <string> #include <string.h> #include <vector> using namespace std; int n,K; long MAX=0; int x; void work(){ cin>>n>>K; vector<vector<int>> group(K,vector<int>(3)); int re; for (int i = 0; i < n; ++i) { cin>>x; re=x%K; //cout<<re<<endl; if(x>group[re][0]){//初始值均为0,所以没有问题 group[re][2]=group[re][1]; group[re][1]=group[re][0]; group[re][0]=x; } else if(x>group[re][1]){ group[re][2]=group[re][1]; group[re][1]=x; } else group[re][2]=x; //cout<<re<<":"<<group[re][0]<<" "<<group[re][1]<<" "<<group[re][2]<<endl; } long v1,v2,v3; for (int j = 0; j < K; ++j) { for (int i = j; i < K; ++i) { if(group[j][0]==0) continue; int kk=(K-i+K-j)%K; v1=group[j][0]; //cout<<"v1分别是"<<v1<<endl; if(i==j) { // if(!group[i][1]) // continue; v2 = group[i][1]; if(j==kk) { // if(!group[j][2]) // continue; v3 = group[j][2]; } else { // if(!group[kk][0]) // continue; v3 = group[kk][0]; } } else{ // if(!group[i][0]) // continue; v2=group[i][0]; if(j==kk){ // if(!group[j][1]) // continue; v3=group[j][1]; } else if(i==kk) { v3 = group[kk][1]; } else { v3 = group[kk][0]; } } if(v1+v2+v3>MAX) //cout<<v1<<" "<<v2<<" "<<v3<<endl; MAX=v1+v2+v3; //cout<<MAX; } } cout<<MAX; } int main(){ work(); return 0; }
原文地址:https://www.cnblogs.com/zhmlzhml/p/13372212.html