题解:P13457 [GCJ 2008 #1A] Minimum Scalar Product
简要题意:
给定两个 vector,
思路:
将
证明在最后。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int T;
LL a[810],b[810];
int cnt;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cnt++;
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
sort(a+1,a+1+n);
sort(b+1,b+1+n);
LL ans=0;
for(int i=1,j=n;i<=n;i++,j--){
ans+=a[i]*b[j];
}
cout<<"Case #"<<cnt<<": "<<ans<<"\n";
}
return 0;
}
证明:
尽管比较显然,但我们还是证明一下,考虑反证法。
假设存在另一种配对方式,使得标量积比
设
假设存在另一种配对方式,存在两个位置
考虑两种配对方式带来的差异:
我们计算差值,以此比较大小:
因此,不存在比
故代码正确。