牛客网 Wannafly挑战赛12-B T95要减肥

链接:https://www.nowcoder.com/acm/contest/79/B

舍友看题觉得是背包问题,而实际上这个题没有“容量”的相关概念,不是个背包。具体分类应该分到贪心。话说这个变量数组开得挺大,一开始我还担心系统内存不够,一度想用vector,后来觉得麻烦试着用数组结果还可以。。

思路:设置变量ans记录结果,对a和b数组排序,a递增序,b递减序。tmp记录选择结果,每选3个a就选3个b,同时考虑一次m。在每次考虑完m之后更新ans(取最大)。如果n不是3的倍数,在循环完成后还需要对tmp和res进行比较大小更新res。

其实在tmp比上一次res小的时候后续的tmp只能减不会增了,后续再循环下去是浪费时间,直接break;

代码:

#include <algorithm>
#include <cstdio>
using namespace std;
int a[1000010],b[1000010];
long long res = 0,tmp = 0;
bool cmp(int a,int b){
	return a > b;
}
int main(){
	int n,m,x = 0;
	scanf("%d%d",&n,&m);
	for(int i = 0;i < n;i++)scanf("%d",&a[i]);
	for(int i = 0;i < n;i++)scanf("%d",&b[i]);
	sort(a,a+n);
	sort(b,b+n,cmp);
	for(int i = 0;i < n;i++){
		tmp += b[i]-a[i];
		if(++x == 3){
			tmp += m;
			if(tmp < res)break;
			res = tmp;
			x = 0;
		}
	}
	res = max(res,tmp);
	printf("%lld\n",res);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/krypton12138/article/details/79674157