当前位置: 代码迷 >> 综合 >> 2021牛客多校联赛#1:K-Knowledge Test about Match
  详细解决方案

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

热度:89   发布时间:2023-12-04 09:07:57.0

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,???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=0n?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=1T?fk??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("");}
}

总结

什么也没有

  相关解决方案