A. 蚂蚁觅食(一)
单点时限: 1.0 sec
内存限制: 512 MB
一只饥饿的小蚂蚁外出觅食,幸运的小蚂蚁发现了好多食物,但是它只有一次搬食物的机会。
可因为力气太小了,它不能搬走重量超过自己体重的食物,且只能搬走位置相邻的两个食物,或者只搬走其中一个。
食物的位置不会改变。
这可难住了这只蚂蚁,它不知道它最多能搬走多重的食物。请帮小蚂蚁计算。
输入格式
第一行一个正整数n,(n>=0并且n<=1000)
第二行n个正整数 A[1].....A[n],A[i] 表示在第i 个位置上食物的重量。A[i]<=1e9.
第三行一个正整数m,表示蚂蚁的体重。(m<=1e9).
输出格式
一个整数表示小蚂蚁能带走的食物的重量。
样例
input
3 1 3 3 4
output
4
蚂蚁一次只能带走一个东西或者是带走相邻的个东西。所以思路有很多:
第一种思路:构造一个数组,用来存储相邻两项的和,然后找到第一个小于等于m的数并记为ans1.然后如果一次就取一个的话,找到第一个小于等于m的数字,几位ans2,,然后输出较大的
AC代码:
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll arr[1000+10]; ll arr1[1000+10]; int main(){ ll n; cin>>n; ll a=0; for(int i=1;i<=n;i++){ cin>>arr[i]; } ll m; cin>>m; ll pos=0; for(int i=2;i<=n;i++){ arr1[pos++]=arr[i]+arr[i-1]; } ll ans1=0,ans2=0; sort(arr+1,arr+1+n); for(int i=n;i>=1;i--){ if(arr[i]<=m){ ans1=arr[i]; break; } } sort(arr1,arr1+pos); for(int i=pos-1;i>=0;i--){ if(arr1[i]<=m){ ans2=arr1[i]; break; } } cout<<max(ans2,ans1)<<endl; return 0; }
思路2:便利每个元素,,如果能装的下判断能不能和下一个一起装,可以的话就装上。
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll arr[1000+10]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>arr[i]; } ll m; cin>>m; ll ans=0; for(int i=0;i<n;i++){ if(arr[i]>m){ continue ; } else if(arr[i]==m){ ans=m; break; } else{ if(arr[i]+arr[i+1]<m){ ans=max(ans,arr[i]+arr[i+1]); } else if(arr[i]+arr[i+1]==m){ ans=m; break; } else{ ans=arr[i]; } } } cout<<ans<<endl;