题意:
n棵苹果树在x轴上排成一排,每棵苹果树有一个坐标值(均不为0)和苹果数量。现在某人从0开始任意选择一个方向走,每遇到一颗新的苹果树就摘下所有苹果,然后掉转方向直到遇到下一颗之前没遇到过的苹果树然后再摘下所有苹果,如此往复直到再也遇不到新的苹果树。问最多能摘下多少个苹果。
分析:
以0为中心,对坐标排序后计算左右两边的苹果树个数。如果左边小于右边,就先从左边摘,反之则先从右边摘。判断左右两边苹果树的多少可以用2*左边苹果树个数,如果此数小于总数n,则说明左边的苹果树少,则从排序后的第一个苹果树开始摘起直到2*左边苹果树个数为止(因为摘的过程中是左右往复的,必然苹果树多的一边除了和少的一边同样的数量外,其余的会摘不到),如果此数大于总数n,则说明左边的苹果树多,则从排序后的neg-(n-neg)=2*neg - n个开始知道最后一个为止(因为neg-(n-neg)=2*neg - n就是右边苹果树比左边苹果树多的个数)。
代码如下:
#include
#include
#include
using namespace std;
int main ()
{
int n, neg=0;
cin>>n;
pair
a[n]; //std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。例如std::pair
或者 std::pair
等。pair实质上是一个结构体,其主要的两个成员变量是first和second,这两个变量可以直接使用。 for(int i=0;i
>a[i].first>>a[i].second; if(a[i].first<0) { neg++; //在起始位置左边的数的个数 } } sort(a, a+n); //将所有位置的数按大小排序 int sol=0; if(neg+neg
#include
#include
#include
using namespace std;
//int n;
typedef struct tree
{
int x;
int a;
}TREE;
TREE T1[110],T2[110];
int n;
int num1,num2;
bool cmp1(TREE lbs,TREE rhs)
{
return lbs.x < rhs.x;
}
bool cmp2(TREE lbs,TREE rhs)
{
return lbs.x > rhs.x;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int pos,numb;
num1 = num2 = 0;
int cnt=0,cns=0;
for(int i=0;i
< num2) for(int i="0;i<=num2;i++)" printf("%lld\n",toal); return 0; code>