P1478 陶陶摘苹果(升级版)

洛谷P1478 陶陶摘苹果(升级版)

                    

 

     我的思路是先不管体力,先将够不到的苹果全部排除,然后将剩下的苹果按体力消耗升序排序,就可以求出最多可摘的苹果数目。

按照这个思路,我在做的时候遇到了两个难点。

①怎样将够不到的苹果排除

  够不到所以就不用摘,所以我将够不到的苹果所消耗的体力变大,只变大到大于陶陶自身体力多一点就行。

 1 for(int i=1;i<=n;++i)
 2 {
 3     for(int j=1;j<=2;++j)
 4     {  
 5         cin>>c[i][j];
 6         if(c[i][1]>a+b)
 7         {
 8           c[i][2]=s+1;
 9         }
10     }
11 }

②怎样将体力按升序排列

    我想用函数,一开始我自己定义,结果没有定义出来。

    我搜了搜,结果发现sort可以将数组按升序排列。

1 for(int i=1;i<=n;++i)
2     {
3         d[i]=c[i][2];
4     }
5     sort(d,d+n+1);

sort括号中第一个数:要排序的数组的起始地址。

第二个数:是结束的地址(最后一个数据的后一个数据的地址)

而且要加头文件

#include<algorithm>

完整代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n;
 5 int main()
 6 {
 7     int m=0,x=0,s,a,b,c[5001][2],d[5001];
 8     cin>>n>>s;
 9     cin>>a>>b;
10     for(int i=1;i<=n;++i)
11     {
12         for(int j=1;j<=2;++j)
13         {  
14           cin>>c[i][j];
15           if(c[i][1]>a+b)
16           {
17               c[i][2]=s+1;
18           }
19         }
20     }
21     for(int i=1;i<=n;++i)
22     {
23         d[i]=c[i][2];
24     }
25     sort(d,d+n+1);
26     for(int i=1;i<=n;++i)
27     {
28         x+=d[i];
29         m++;
30         if(s<x)
31         {
32             cout<<m-1;break;
33         }  
34     }
35     if(n==0||s==0||a+b==0)
36       cout<<0;
37     return 0;
38 }

当然,sort也可以降序排列,升序排列只是sort的默认情况。

less<数据类型>()是从小到大排序 

greater<数据类型>()是从大到小排序。

选择升序或降序并加在括号里,就可以将数组降序排列。如:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int a[10];
 7     for(int i=0;i<10;i++)
 8        cin>>a[i];
 9     sort(a,a+10,greater<int>());
10     for(int i=0;i<10;i++)
11     cout<<a[i]<<" ";
12     return 0;
13 }

 

posted @ 2020-02-05 17:07  zkw666  阅读(370)  评论(0编辑  收藏  举报