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

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

总结

什么也没有

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值