大一升大二的暑假刚开始接触acm,完全不知道是怎么回事,其实一个暑假都没有多清晰的认识。
现在已经12月,再回顾之前的题目,抽时间整理。这是接触acm见的第一个题,是暑假训练赛1做的一道题。自己写的第一份代码。所有都是为自己写的,方便回顾,因为太渣,所以希望没有人看。
题目大意:一个人在一排树中摘苹果,人的起点位置为0,每棵树对应一个位置(有负有正)和苹果数,人每摘完一棵树上的苹果,方向反转,直到反方向没有苹果。0位置没有苹果树。求最多能摘到多少苹果。
输入:树的棵数,每一行一棵树的位置和树上的苹果个数。
输出:苹果个数。
想法:将位置排序,其对应的苹果个数随其排列,算出有多少负方向的和正方向的,多的方向能摘到的棵数等于少的方向能摘到的棵数,均从0位置开始。
#include<iostream> using namespace std; int main() { int k,a[200000],b[100000];//2个数组,分别放位置和个数 cin>>k; for(int i=0;i<k;i++) { cin>>a[i]>>b[i]; }//输入 for(int j=0;j<k-1;j++) { for(int m=0;m<k-1;m++) { int q,p; if(a[m]>a[m+1]){q=a[m];a[m]=a[m+1];a[m+1]=q;p=b[m];b[m]=b[m+1];b[m+1]=p;} } }//根据位置排序,个数随位置排序 int e=0; for(int n=0;n<k;n++) { if(a[n]<0)e++; }//计算负方向有多少颗树 int f; f=k-e;//正方向的 int c; if(e<=f) { c=f-e;//取差 int sum=0; for(int x=0;x<k-c+1;x++) { sum+=b[x]; } cout<<sum; }//右边多,把苹果个数加起来 else { c=e-f; int sum1=0; for(int y=c-1;y<k;y++) { sum1+=b[y]; } cout<<sum1; }//左边多,把苹果个数加起来 }