题目出乎意外的比较简单:
D:贪心,只要我们sort();然后从小到大枚举,能得到的拿到,不能的忽视。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<string.h> 5 #include<string> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<vector> 10 11 #define N 123456 12 #define inf 0x3f3f3f 13 using namespace std; 14 typedef long long ll; 15 16 int a[N],b[N]; 17 int main() 18 { 19 int n; 20 cin>>n; 21 for (int i=1;i<=n;i++) cin>>a[i]; 22 sort(a+1,a+n+1); 23 24 int ans=0; 25 ll tmp=0; 26 for (int i=1;i<=n;i++) 27 { 28 if (a[i]>=tmp) 29 { 30 ans++; 31 tmp+=a[i]; 32 } 33 } 34 cout<<ans<<endl; 35 return 0; 36 }
C:dp:
dp[i][0]:第i颗树向左边倒最大的数目。
dp[i][1]: 第i颗树不倒,产生的最大数目。
dp[i][2]: 第i棵树倒右边,产生的最大数目。
//第i颗树倒左边
if (a[i-1]+b[i]<a[i]) dp[i][0]=max(dp[i][0],dp[i-1][0]+1);
if (a[i-1]+b[i]<a[i]) dp[i][0]=max(dp[i][0],dp[i-1][1]+1);
if (a[i-1]+b[i-1]<a[i]-b[i]) dp[i][0]=max(dp[i][0],dp[i-1][2]+1);
//第i颗树中立
dp[i][1]=max(dp[i-1][0],dp[i-1][1]);
if (a[i-1]+b[i-1]<a[i]) dp[i][1]=max(dp[i][1],dp[i-1][2]);
//第i颗树倒右边
dp[i][2]=max(dp[i-1][0],dp[i-1][1])+1;
if (a[i-1]+b[i-1]<a[i]) dp[i