该题目为模拟题类型
用结构体数组储存数据,并记录负数与正数的个数,再进行由小到大sort()排序,然后对负数数目和正数数目的大小比较进行分类,将小的一边的m树上的苹果数全部加起来,另一边加m+1个树上的苹果
#include <cstdio>
#include <algorithm>
using namespace std;
struct Coor
{
int coordinate;
int apples;
};
Coor coor[105];
bool cmp(const Coor data1, const Coor data2)
{
return data1.coordinate < data2.coordinate;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int negative_number = 0;
int active_number = 0;
if(n == 0)
printf("0\n");
else
{
for(int i = 0; i < n; i++)
{
scanf("%d",&coor[i].coordinate);
if(coor[i].coordinate < 0)
negative_number++;
else
active_number++;
scanf("%d",&coor[i].apples);
}
sort(coor, coor + n, cmp);
if(negative_number == 0)
printf("%d\n",coor[0].apples);
else if(active_number == 0)
printf("%d\n",coor[n - 1].apples);
else
{
int ans = 0;
int sign;
for(int i = 0; i < n - 1; i++)
{
if(coor[i].coordinate < 0 && coor[i + 1].coordinate > 0)
{
sign = i;
break;
}
}
if(negative_number > active_number)
{
for(int i = sign + 1; i < n; i++)
{
ans += coor[i].apples;
}
for(int i = negative_number - 1; i > n - 2 * active_number - 2; i--)
{
ans += coor[i].apples;
}
printf("%d\n",ans);
}
else if(negative_number < active_number)
{
for(int i = 0; i < negative_number; i++)
{
ans += coor[i].apples;
}
for(int i = sign + 1; i < 2 * negative_number + 1; i++)
{
ans += coor[i].apples;
}
printf("%d\n",ans);
}
else
{
for(int i = 0; i < n; i++)
{
ans += coor[i].apples;
}
printf("%d\n",ans);
}
}
}
}
return 0;
}