3 solutions
-
0
前缀和->max前i-1个最大值,倒数(n-i+1)个最大值 1.设置1+n个结点acc(前缀和),每个结点表示在此i结点上需要acc[i]才能到达下一节点,结点acc[0]为a[0],其余1~n的acc[i] = acc[i-1] + a[i] - b[i] 2.求得prefix[i](i属于0~n),prefix[0] =acc[0],其余prefix[i] = max(prefix[i-1] +,acc[i]),表示前i-1至少要满足的和通过结点i需要满足的能量,即为前i个,subfix同理 3.当结点i同学没睡,无法得到b[i],此时对前i-1个结点无影响,对后面有,ans = max(prefix[i-1],sunfix[i]+b[i]),subfix为后面最大数,而因为从i处无法得到b[i],则后面所有数包括subfix[i],都要+b[i].
#include <iostream> #include <vector> using namespace std; int main(){ int n; cin>>n; vector<int> a(n+1); vector<int> b(n+1); for(int i= 0;i<=n;i++){ cin>>a[i]; } for(int i= 1;i<=n;i++){ cin>>b[i]; } vector<int> acc(n+1); vector<int> prefix(1+n); vector<int> subfix(1+n); acc[0] = a[0]; prefix[0] = a[0]; for(int i = 1;i <= n;i++){ acc[i] = acc[i-1] + a[i] - b[i]; prefix[i] = max(prefix[i-1],acc[i]); } subfix[n] = acc[n]; for(int i = n-1;i>0;i--){ subfix[i] = max(subfix[i+1],acc[i]); } int ans; for(int i = 1;i<=n;i++){ ans = max(prefix[i-1],subfix[i]+b[i]); cout<<ans<<' '; } }
Information
- ID
- 41
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 2
- Tags
- # Submissions
- 232
- Accepted
- 54
- Uploaded By