蓝桥 倍数问题 (我为什么会这么菜)

题目描述
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

输入
从标准输入读入数据。

第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。
输出
输出到标准输出。
输出一行一个整数代表所求的和。
样例输入
4 3
1 2 3 4
样例输出
9

又又又又是看学长的代码才会做的题,把模k相同的数放到一个一块。
每次取出一个就会取出这一组中最大的,两重循环控制两个组模k的结果所在的组,剩下一个可以直接计算出来,更新一个res就可以了。
失恋第好多好多天,心情烦躁,还是没缓过来。蓝瘦香菇哈哈,再加上题也不会做,课也听不明白,颓废了颓废了。。。。。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;

priority_queue<ll, vector<ll>, less<ll> > q[1005];
int n, k;
int main(){ 
	cin>>n>>k;
	for (int i=1; i<=n; i++){
		ll t;
		cin>>t;
		q[t%k].push(t);
	}
	ll res=0;
	for (int i=0; i<k; i++){
		if (q[i].size()==0)
			continue;
		ll a=q[i].top();
		q[i].pop();
		for (int j=0; j<k; j++){
			if (q[j].size()==0)
				continue;
			ll b=q[j].top();
			q[j].pop();
			if (q[(k-i-j+k)%k].size()){
				res = max(res, a+b+q[(k-i-j+k)%k].top());
			}
			q[j].push(b);
		}
		q[i].push(a);
	}
	cout<<res;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/105343053