对比之美

[题目链接](https://www.nowcoder.com/practice/0fcbb83370124426bfee75aca43b7ee7)

思路

给定 个格子和 个收藏品,要求将收藏品放入格子中(每个格子放 个),使美观度 最大。

分类讨论

:没有相邻对,美观度为

:将所有 个收藏品放在一个格子,另一个放 ,美观度为

:将所有 个收藏品放在某个中间位置(非端点),例如 ,该位置与左右邻居各产生 的差值,美观度为

为什么 是上界?注意每个收藏品对美观度的贡献最多为 (它所在格子最多参与两个相邻对的差值),所以总美观度 。当 时,把所有物品放在一个非端点格子恰好达到这个上界。

复杂度

  • 时间复杂度: 每组数据
  • 空间复杂度:

代码

C++

#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        long long n,m;
        scanf("%lld%lld",&n,&m);
        long long ans;
        if(n==1) ans=0;
        else if(n==2) ans=m;
        else ans=2*m;
        printf("%lld%c",ans,t?' ':'\n');
    }
    return 0;
}

Java

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine().trim());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < t; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine().trim());
            long n = Long.parseLong(st.nextToken());
            long m = Long.parseLong(st.nextToken());
            long ans;
            if (n == 1) ans = 0;
            else if (n == 2) ans = m;
            else ans = 2 * m;
            if (i > 0) sb.append(' ');
            sb.append(ans);
        }
        System.out.println(sb.toString());
    }
}