#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n % 2 != 0) {
printf("-1\n");
return 0;
}
int k = n/2; // n为偶数
int y_max = n/8; // 8个袋子的最大数量
int ans = -1;
for (int y = y_max; y>=0; y--) {
// 计算剩余的橘子数=2k-8y = 4k-8y? 注意:方程是3x+4y=k
if ( (k - 4*y) >=0 && (k-4*y)%3 ==0 ) {
int x = (k-4*y)/3;
ans = x+y;
break;
}
}
printf("%d\n", ans);
return 0;
}
cpp复制代码
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100010
int a[MAX_N], b[MAX_N];
int tree[4 * MAX_N];
// 手动实现二分查找(替代lower_bound)
int binary_search(int arr[], int n, int x) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (arr[mid] < x) l = mid + 1;
else if (arr[mid] > x) r = mid - 1;
else return mid; // 找到精确匹配
}
return l; // 返回第一个不小于x的位置
}
// 线段树相关函数保持不变(同原代码)
void build(int node, int l, int r) {
tree[node] = 0;
if (l == r) return;
int mid = (l + r) >> 1;
build(node << 1, l, mid);
build(node << 1 | 1, mid + 1, r);
}
void update(int node, int l, int r, int idx, int delta) {
if (l == r) {
tree[node] += delta;
return;
}
int mid = (l + r) >> 1;
if (idx <= mid) update(node << 1, l, mid, idx, delta);
else update(node << 1 | 1, mid + 1, r, idx, delta);
tree[node] = tree[node << 1] + tree[node << 1 | 1];
}
int query(int node, int l, int r, int k) {
if (l == r) return l;
int mid = (l + r) >> 1;
if (tree[node << 1] >= k)
return query(node << 1, l, mid, k);
else
return query(node << 1 | 1, mid + 1, r, k - tree[node << 1]);
}
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int main() {
int n, m;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
b[i] = a[i];
}
// 离散化处理
qsort(b, n, sizeof(int), cmp);
m = 1;
for (int i = 1; i < n; i++)
if (b[i] != b[i - 1]) b[m++] = b[i];
// 构建权值线段树
build(1, 0, m - 1);
// 初始化更新(使用binary_search替代lower_bound)
for (int i = 0; i < n; i++) {
int pos = binary_search(b, m, a[i]);
update(1, 0, m - 1, pos, 1);
}
int len = n;
for (int i = 0; i < n; i++) {
int k = (len + 1) / 2; // 中位数位置
int idx = query(1, 0, m - 1, k);
printf("%d ", b[idx]);
update(1, 0, m - 1, idx, -1); // 删除当前中位数
len--;
}
return 0;
}
cpp复制代码
#include <stdio.h>
#include <stdlib.h>
#define ll long long
ll terms[100]; // will not exceed 30 items
int main() {
int T;
scanf("%d",&T);
while (T--) {
ll n;
scanf("%lld",&n);
ll p = 1;
int count = 0;
while (n>0) {
ll r = n % 3;
if (r==0) {
n /= 3;
} else if (r==1) {
terms[count++] = p;
n = (n-1)/3;
} else if (r==2) {
terms[count++] = 2 * p;
n = (n-2)/3;
}
p *= 3;
}
// reverse terms array: index 0 to count-1 (originally added in increasing b, so we output from count-1 to 0)
// but the problem requires from large to small.
printf("%d\n",count);
if (count==0) {
// no terms, but count=0, so just output the empty line?
printf("\n");
} else {
// output from the last term to the first term
for (int i=count-1; i>=0; i--) {
printf("%lld ", terms[i]);
}
printf("\n");
}
}
return 0;
}