题意:n棵苹果树在x轴上排成一排,每棵苹果树有一个坐标值(均不为0)和苹果数量。现在某人从0开始任意选择一个方向走,每遇到一颗新的苹果树就摘下所有苹果,然后掉转方向直到遇到下一颗之前没遇到过的苹果树然后再摘下所有苹果,如此往复直到再也遇不到新的苹果树。问最多能摘下多少个苹果。
水题。以0为中心,对坐标排序后计算左右两边的苹果树个数。如果左边小于右边,就先从左边摘,反之则先从右边摘。最后看有多少个苹果树摘不到即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <map>
using namespace std;
const int MAX = 105;
int n;
int x, a, sum;
vector <pair <int, int> > l, r; //懒得写结构体了
bool cmp(pair <int, int> p1, pair <int, int> p2)
{
return p1.first < p2.first;
}
void input()
{
l.clear();
r.clear();
sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &x, &a);
if(x < 0)
l.push_back(make_pair(x, a));
else
r.push_back(make_pair(x, a));
sum += a;
}
}
void solve()
{
int ls = l.size(), rs = r.size();
int total = abs(ls - rs) - 1; //不能摘到的苹果树棵树
sort(l.begin(), l.end(), cmp);
sort(r.begin(), r.end(), cmp);
if(l.size() > r.size())
{
for(int i = 0; i < total; i++) //左边不能摘到的从左算起
sum -= l[i].second;
}
else
{
for(int i = 0; i < total; i++) //右边不能摘到的从右算起
sum -= r[r.size() - i - 1].second;
}
printf("%d\n", sum);
}
int main()
{
while(scanf("%d", &n) != EOF)
{
input();
solve();
}
return 0;
}