洛谷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 }