题目大意: 有n个数,用某种策略,将其中一些数乘负一(即变成该数的负数),使得这列数的和为0,输出符号,若不存在该策略则输出error。
因为要想这列数和为0,显然该列数和为偶数才能有方法;
该列数和的一半即为负数(或者正数)的和,所以用和的一半不断去找负数(或者正数),并减去这个数,直 到和的一半为0 时结束;
寻找负数:
while(sum){
if( sum >= num[cur].x ){
sum -= num[cur].x;
result[num[cur].id] = 1;
}
cur++;
}
数据结构:建立结构体,存储数值和初始位置。 利用sort函数,对数值降序,求出该数的符号后,利用数组下标记录符号,下标即为该数的初始位置。
完整代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct money
{
int id;
int x;
}num[100];
int result[100];
bool cmp(money n,money m){
return n.x > m.x;
}
int main(int argc, char const *argv[])
{
int n ;
while( scanf("%d",&n) && n )
{
int cur = 0,sum = 0;
for (int i = 0; i < n ; ++i){
scanf("%d",&num[i].x);
num[i].id = i;
sum += num[i].x;
} //数据数组初始化
if( sum%2 ) //判断
printf("Error\n");
else
{
sort(num,num+n,cmp);
sum = sum/2;
for (int i = 0; i < n; ++i)
result[i] = 0; //结果数组初始化
cur = 0;
while(sum){
if( sum >= num[cur].x ){
sum -= num[cur].x;
result[num[cur].id] = 1;
}
cur++;
} //不断寻找负数,sum = 0结束
for (int i = 0; i < n; ++i)
if(result[i])
printf("-1\t");
else
printf("+1\t"); //输出符号
}
}
return 0;
}