K-Knowledge Test about Match
原题链接:https://ac.nowcoder.com/acm/contest/11166/K
题目大意
给定两个长度为 n n n的数组: a = { 0 , 1 , 2 , ⋅ ⋅ ⋅ , n − 1 } a=\{0,1,2,···,n-1\} a={0,1,2,⋅⋅⋅,n−1} b = { a 1 , a 2 , a 3 , ⋅ ⋅ ⋅ , a n − 1 } b=\{a_1,a_2,a_3,···,a_{n-1}\} b={a1,a2,a3,⋅⋅⋅,an−1}现在你可以任意调整数组 b b b中的元素顺序,使得它们的loss函数最小。
定义数组 a a a与数组 b b b的loss函数为: f ( a , b ) = ∑ i = 0 n − 1 ∣ a i − b i ∣ f(a,b)=\sum\limits_{i=0}^{n-1}\sqrt{\left|a_i-b_i\right|} f(a,b)=i=0∑n−1∣ai−bi∣由于解决这个问题的时间有限,所以只要求出近似值即可。
共 T T T组数据,设第 k k k组数据的答案的loss函数为 f k ∗ f_k^* fk∗,你的输出结果的loss函数为 f k ^ f_k\hat{} fk^,则只需满足一下不等式即可: 1 T = ∑ k = 1 T f k ^ − f k ∗ f k ∗ ≤ 4 \frac{1}{T}=\sum\limits_{k=1}^{T}\frac{f_k\hat{}-f_k^*}{f_k^*}\le4% T1=k=1∑Tfk∗fk^−fk∗≤4
题目思路
很容易可以看出多个数偏移很少比几个数偏移很多更好,所以枚举偏移的值,从0枚举到n-1,即可。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,t,a[10001],b[100001];
int main() {
cin>>t;
while(t--)
{
memset(a,-1,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x),b[x]++;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(b[j]!=0)
{
if(b[j]>0 && j+i<n && a[j+i]==-1)
{
a[j+i]=j;
b[j]--;
}
if(b[j]>0 && j-i>=0 && a[j-i]==-1)
{
a[j-i]=j;
b[j]--;
}
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
puts("");
}
}
总结
什么也没有