A. Lala Land and Apple Trees

本文探讨了一种算法,用于确定在特定方向行走时,如何通过选择路径来最大化摘取苹果的数量。算法首先对苹果树进行排序,并根据它们的位置决定优先摘取哪一侧的苹果树,从而实现最大化收益。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

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>
       
      
      
     
     
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值