1 条题解
-
1
简单贪心 很明显我们先取中间的最优,因为它可以影响左右两个,如果取完中间的还不够再判断之前的能不能再取
代码实现
#include<iostream> #include<algorithm> using namespace std; #define int long long int a[100005],b[100005]; signed main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } if(n==1)//特判1 { if(a[1]>m) { cout <<a[1]-m; } else cout <<"0"; return 0; } int sum=0; for(int i=2;i<=n;i++)//模拟,先取中间位 { if(a[i-1]+a[i]>m)//如果太多 { if(a[i]>=a[i]+a[i-1]-m)//判断只取a[i]能不能满足 { sum+=a[i]+a[i-1]-m; a[i]=a[i]-(a[i]+a[i-1]-m); } else\\如果不能,取a[i-1] { sum+=a[i]; a[i]=0; if(a[i-1]>m) { sum+=a[i-1]-m; a[i-1]=m; } } } } cout <<sum<<'\n'; }
- 1
信息
- ID
- 1006
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 333
- 已通过
- 21
- 上传者