java的动态规划做法11-20测试点全tle,求指点
查看原帖
java的动态规划做法11-20测试点全tle,求指点
1237294
Cx620楼主2023/12/19 21:12
//dp做法是借鉴题解的思路
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

/**
 * @author WUHAO
 * @create 2023-12-19 20:03
 */
public class Main
{
    static int N= (int) (5e5+10);
    static Nod[] arr=new Nod[N];
    static long[] f=new long[N];
    static long[] sum=new long[N];
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        long c = scan.nextLong();
        long n = scan.nextLong();
        long k = scan.nextLong();
        for(int i=1;i<=n;i++)
        {
            arr[i]=new Nod();
            arr[i].v=scan.nextInt();//存值
            arr[i].i=i;//存索引
        }
        Arrays.sort(arr, 1, (int) (n + 1), new Comparator<Nod>() {
            @Override
            public int compare(Nod o1, Nod o2)
            {
                return o2.v-o1.v;
            }
        });

        for(int i = (int) k; i<=n; i++)//k<i==>f(i)>k,与题中f(i)<i冲突,改
        {
            sum[arr[i].i]=arr[(int) k].v-arr[i].v;
        }
        for(int i = (int) (k-1); i>=1; i--)//k>i==>k>g(i),与题中g(i)>k冲突,改   f[i]为使a(i+1)~a(k)都变为ai所需要的操作数
        {
            f[i]=f[i+1]+(k-i)*(arr[i].v-arr[i+1].v);
            sum[arr[i].i]=f[i];
        }
        for(int i=1;i<=n;i++)
        {
            System.out.println(sum[i]);
        }

    }
}
class Nod
{
    int i;
    int v;
}

2023/12/19 21:12
加载中...