int max_val = 0; vector<int> ans; int n, m; voiddfs(vector<int>& arr, int index, int start){ // index 选择的元素个数 start 遍历的开始位置 if (max_val == n - 1) { // 差异值个数最大,无需搜索 return; }
if (index > n) { // 选完所有元素 int new_val = CountValue(arr); if (new_val > max_val) { max_val = new_val; ans = arr; } return; } for (int i = start; i <= m - n + index; i++) { arr.push_back(i); // 尝试当前元素 dfs(arr, index + 1, i + 1); arr.pop_back(); // 回退 } }
intmain(){ cin >> n >> m; if (n == m) { for (int i = 1; i <= n; i++) { cout << i << " "; } } else { vector<int> arr; dfs(arr, 1, 1); for (int num : ans) { cout << num << " "; } } return0; }
intmain(){ int n, m; cin >> n >> m; if (n == m) { // 不用选择,只能选择所有数字 for (int i = 1; i <= n; i++) { cout << i << " "; } } else { vector<int> arr; arr.emplace_back(1); int delta = 1; // 间距 for (int i = 2; i <= n; i++) { int next_val = arr.back() + delta; // 下一个预期数字 if (next_val <= m && m - next_val >= n - i) { // 该数字小于m且与m之间有以后数字的空间 arr.emplace_back(next_val); // 加入序列并增加间距 delta++; } else { break; } } while (arr.size() < n) { // 补全后续序列 arr.emplace_back(arr.back() + 1); } for (int num : arr) { cout << num << " "; } } return0; }
intmain(){ int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a.begin(), a.end()); longlong sum = 0; int x = 0; // 左右指针 int left = 0; int right = n - 1; while (left < right) { sum += max(0, a[right] - x); // 如果a[i]大于x则将a[i]-x勇气值加上 x = a[right]; sum += max(0, a[left] - x); x = a[left]; left++; right--; } if (left == right) { // 数组元素个数为奇数,计算中间元素勇气值 sum += max(0, a[right] - x); } cout << sum << endl; }
intmain(){ int n, k; cin >> n >> k; vector<int> arr(n); longlong sum = 0; for (int i = 0; i < n; i++) { cin >> arr[i]; sum += arr[i]; } vector<queue<int>> low_bit(n); // 各个数的二进制组成 9:8 1 10:8 2 priority_queue<pair<int, int>> max_low_bit; // pair:最低位1大小-所属数字下标 for (int i = 0; i < n; i++) { int x = arr[i]; int k = 1; while (x != 0) { if (x % 2 == 1) { low_bit[i].emplace(k); // 将1填入对应队列 } x /= 2; k *= 2; } max_low_bit.emplace(low_bit[i].front(), i); // 将每个数的最低位1加入优先队列 } for (int i = 0; i < k; i++) { // 贪心算法,每次选择最低位1最大的删掉 auto [delta, pos] = max_low_bit.top(); max_low_bit.pop(); sum -= delta; low_bit[pos].pop(); if (!low_bit[pos].empty()) { // 当前数字非空,加入下一位 max_low_bit.emplace(low_bit[pos].front(), pos); } } cout << sum << endl; }