问题
https://vjudge.net/problem/UVA-11389
分析
先是排序,从小到大的排序。
凑对子,每一个下午路线要和一个夜晚路线配合,是他们尽量大于等于d。所以直接用最小的和另一个的最大的相加,这里贪心,大概想了一下可行,没有严格证明。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=100+5;
int n,d,r,a[maxn],b[maxn],kase=0;
int main(void){
while(scanf("%d%d%d",&n,&d,&r)==3 && n){
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);
int ans=0;
for(int i=0;i<n;++i){
ans+=max(a[i]+b[n-1-i]-d,0)*r;
}
printf("%d\n",ans);
}
}