Codeforces Round 809 (Div. 2) D1. Chopping Carrots (Easy Version) 题解

题意

Codeforces Round 809 (Div. 2) D1. Chopping Carrots (Easy Version)

给两个整数n,k, 一个数组 a, 要求构造一个同样长度的数组 p, 使得 max1in(aipi)min1in(aipi) 最小,其中 pik 。输出最小值。

思路

我们可以设定变化后的数组最小值为 v=0,1,2,...,a1 ,这里 a1 表示数组 a 最小值。接着依次求解在当前情况下 ai 最小为多少(aiv的情况下),记录 ai 的最大值和最小值,枚举完后用最大值减最小值更新答案。

代码

#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>

#define fi first
#define se second

using namespace std;
using ll = long long;
using pii = pair<int, int>;

const double eps = 1e-4;
const int N = 3010;
int n, k;
int a[N];

void solve() {
    scanf("%d%d", &n, &k);
    for (int i=1; i<=n; i++) {
        scanf("%d", &a[i]);
    }
    sort(a + 1, a + 1 + n);
    int res = 1e9;
    for (int v = 0; v <= a[1]; v++) {
        int maxv = 0, minv = 1e9;
        for (int i = 1; i<=n; i++) {
            int p = k;
            if (v) p = min(k, a[i] / v);
            maxv = max(maxv, a[i] / p);
            minv = min(minv, a[i] / p);
        }
        res = min(res, maxv - minv);
    }
    printf("%d\n", res);
}

int main() {
    // multiple case
    int t; scanf("%d", &t);
    while(t--) {
        solve();
    }

    // single case
    // solve();

    return 0;
}
posted @   1v7w  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2020-11-14 UVa213 - Message Decoding 题解
2020-11-14 UVa133 - The Dole Queue 题解
2020-11-14 UVa512 - Spreadsheet Tracking 题解(两种解法)
点击右上角即可分享
微信分享提示