题目:点击打开链接
题意:
有n个城市排列在一条线上,两个人刚开始处在p位置,每到一个城市可以获得这个城市的财宝,但是需要一天。他们一共有t天时间可以行动,但是他们之间的距离不能超过m,求最大获得财富。
分析:
若想获得最大财富,那么这两个人刚开始必须分头走,一直走到相距m,如果还有时间的话,那就要同时往左,或者同时往右走,一直走到头,如果还有时间的话,那么再返回,看看是否还能走到另一边获得财富。情况不算很多,细心一点的话,慢慢分条件求出来,不难。
我看了这篇博客,写的很好,点击打开链接,大神写的代码之所以好,是因为他们弄清了题意,然后就开始想个好的方法去敲,而自己弱的原因是刚有点思路,就开始一步步来,这样很容易乱,而且花时间很长。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include <vector>
using namespace std;
typedef long long ll;
const int N=100000+5;
ll val[N];
ll sum[N];
int n,m,p,t;
ll solve(int p)
{
ll ans=val[p];
for(int r=min(n,p+t);r>=max(1,p-t);--r){
int l=max(1,max(p-t,r-m));
int res_t=t-max(p-l,r-p);
int l1=max(1,l-res_t);
int r1=min(n,r+res_t);
ans=max(ans,max(sum[r]-sum[l1-1],sum[r1]-sum[l-1]));
}
return ans;
}
int main()
{
//freopen("f.txt","r",stdin);
while(~scanf("%d%d",&n,&p)){
sum[0]=0;
for(int i=1;i<=n;i++){
scanf("%lld",&val[i]);
sum[i]=sum[i-1]+val[i];
}
scanf("%d%d",&m,&t);
cout<<solve(p)<<endl;
}
return 0;
}