2021牛客多校联赛#1:K-Knowledge Test about Match

K-Knowledge Test about Match

原题链接:https://ac.nowcoder.com/acm/contest/11166/K

文章目录

  • K-Knowledge Test about Match
    • 题目大意
    • 题目思路
    • 代码实现
    • 总结

题目大意

给定两个长度为 n n n的数组: a = { 0 , 1 , 2 , ⋅ ⋅ ⋅ , n − 1 } a=\{0,1,2,···,n-1\} a={0,1,2,n1} b = { a 1 , a 2 , a 3 , ⋅ ⋅ ⋅ , a n − 1 } b=\{a_1,a_2,a_3,···,a_{n-1}\} b={a1,a2,a3,an1}现在你可以任意调整数组 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=0n1aibi 由于解决这个问题的时间有限,所以只要求出近似值即可。

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=1Tfkfk^fk4

题目思路

很容易可以看出多个数偏移很少比几个数偏移很多更好,所以枚举偏移的值,从0枚举到n-1,即可。

代码实现

#include
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("");
	}
}

总结

什么也没有

你可能感兴趣的:(多校联赛,c++,枚举类)