Trees in a Row 题解

发布时间 2023-08-05 19:01:16作者: xvl

题目传送门

一道枚举题。

数据范围非常小,考虑暴力枚举。枚举第一棵树的高度,如果按照这样排列需要的操作次数是最小的,就选用这棵树作为新的第一棵树的高度,然后求出剩下的树的高度。

Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n, k, maxn = -INF, maxl = -INF, top, q; // top 是新的第一个高度
int a[1005], b[1005];
signed main() {
    ios :: sync_with_stdio(0);
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        maxn = max(maxn, a[i]); // 只需要枚举到最大值
    }
    for (int i = 1; i <= maxn; i++) {
        int cnt = i, sum = 0; // sum 是统计以 i 这个高度为开头有多少棵树不用进行操作
        if (i == a[1]) sum++; 
        for (int j = 2; j <= n; j++) {
            cnt += k;
            if (cnt == a[j]) sum++;
        }
        if (sum > maxl) { // 最多有多少棵树不操作
            maxl = sum;
            top = i;
        }
    }
    b[1] = top;
    int x = top + k;
    for (int i = 2; i <= n; i++) {
        b[i] = x;
        x += k;
    }
    for (int i = 1; i <= n; i++) {
        if (a[i] != b[i]) q++;
    }
    cout << q << "\n";
    for (int i = 1; i <= n; i++) {
        if (a[i] < b[i]) cout << "+ " << i << " " << b[i] - a[i] << "\n";    
        if (a[i] > b[i]) cout << "- " << i << " " << a[i] - b[i] << "\n";
    }
    return 0;
}