用c++写一个代码 用acm模式 输入n个整数 能够分成相等的两份 就返回true 否则返回false
时间: 2023-05-26 15:04:56 浏览: 146
用C++程序编写二分法
这里是一个ACM模式下用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int n, i, sum = 0;
scanf("%d", &n);
int *a = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
if (sum % 2) {
printf("false\n");
free(a);
return 0;
}
qsort(a, n, sizeof(int), cmp);
int target = sum / 2;
for (i = n - 1; i >= 0; i--) {
if (target >= a[i]) {
target -= a[i];
}
if (!target) {
printf("true\n");
free(a);
return 0;
}
}
printf("false\n");
free(a);
return 0;
}
```
该代码首先通过 `scanf` 读取输入的整数个数 `n`,然后分配了一个长度为 `n` 的整型数组 `a` 来存储这些整数。
接着,通过遍历 `a` 数组统计所有元素的和,并判断是否为奇数。若为奇数,说明无法将其分成两份,直接返回 `false`。
如果和为偶数,将 `a` 数组从小到大排序,然后从最大的元素开始遍历,如果当前元素小于等于剩余需要凑成的总和,就减去该元素并继续遍历。如果总和减到了0,说明可以将 `a` 数组划分成两份,返回 `true`;如果遍历完了还没有成功凑成总和,说明无法将其分成两份,返回 `false`。
最后,别忘了在操纵结束后释放内存。
阅读全文