链接: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;
}