这个题,第一反应一定是三个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; }