👌
ABC 117 | C - Streamline
問題
考えたこと
この時、以下のように
コマの移動した回数はコマが専有する区間-
コード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
const int MOD = 1e9 + 7;
int main() {
ll n, m;
cin >> n >> m;
vector<ll> x(m);
for (int i = 0; i < m; i++) {
cin >> x[i];
}
sort(x.begin(), x.end());
if (m <= n) {
cout << 0 << endl;
return 0;
}
// n-1個の区間を長い方から選べばいいい
vector<int> widths; // 区間を入れていく
for (int i = 0; i < m - 1; i++) {
widths.push_back(abs(x[i + 1] - x[i] - 1));
}
int ans = abs(x[m - 1] - x[0] + 1); // すべてのマス
sort(widths.rbegin(), widths.rend());
for (int i = 0; i < n - 1; i++) { // いらない区間を引く
ans -= widths[i];
}
// マスの数を引く
ans -= n;
cout << ans << endl;
}
Discussion