题意:有n个城市并排着,每个城市有些珠宝,有两个人站在第s个城市准备收集珠宝,两人可以各自行动,但两人之间的距离不能超过dis,而且每经过一个城市就需要消耗1天,他们仅有t天时间收集珠宝,问最多能收集多少珠宝?

思路:

  其实就是类似一个滑动窗口在收集一个序列上的权值。首先两个人可以同时往两边散开,直到极限距离dis(这样省时),然后他们可能往左/右走,也可能往左走一会儿再往右走,也可能往右走一会儿再往左走。可以看出其实这些考虑都是对称的,那么我们主要考虑1边就行了。可以尝试枚举往左边走k天,其他t-k天往右走(利用前缀和)。注意有可能dis是个奇数的,那么在t充足的情况下,应该两边扩展到dis-1就停下呢,还是往左/右一点呢?还得靠枚举,左边试一下,右边试一下。dis也可能比t还大,那么最多也就是同时往两边扩展t天。

  情况不算多,但是写起来还是得很小心的。还有,数据必须用longlong了。对称情况只需要反转一下序列,改变一下起点s。时间复杂度O(n)。

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=;
const double PI = acos(-1.0);
LL w[N], sum[N];
int n, dis, s;
LL get_ans(int p1,int p2,int t)
{
LL big=sum[p2]-sum[p1-];
LL ans=big;
for(int k=; k<p1&&t>=k; k++) //枚举给左边k天,其他给右边
{
LL left=sum[p1-]-sum[p1-k-], right=;
int r=t-*k; //若大于0,则可继续往右走
if( r> ) right=sum[min(n,p2+r)]-sum[p2]; //右边还能获得珠宝
ans=max(ans, big+left+right);
}
return ans;
} LL cal(int t) //初始定点p1,p2必须拉到最长
{
int p1=max(, s-min(dis/,t));
int p2=min(n, s+min(dis/,t));
LL ans=;
t-=dis/;
if(dis%==) //奇数
{
if( t< || p1==&&p2==n ) return get_ans(p1,p2, t); //t已无剩
if( p1> ) ans=max(ans, get_ans(p1-,p2, t-)); //左坑
if( p2<n ) ans=max(ans, get_ans(p1,p2+, t-)); //右坑
}
else //偶数,不需要占坑
{
ans=max(ans, get_ans(p1,p2, t));
}
return ans;
} int main()
{
freopen("input.txt", "r", stdin);
int t;LL ans;
while(~scanf("%d%d",&n,&s))
{
memset(sum, , sizeof(sum));
for(int i=; i<=n; i++)
{
scanf("%d",&w[i]);
sum[i]+=sum[i-]+w[i];
}
scanf("%d%d",&dis,&t); //dis是两人的距离上限,t是所有的时间
ans=cal(t); reverse(w+,w+n+); //反过来继续求。
memset(sum, , sizeof(sum));
for(int i=; i<=n; i++) sum[i]=sum[i-]+w[i];
s=n+-s;
ans=max(ans, cal(t));
cout<<ans<<endl;
}
return ;
}

AC代码

ZOJ 3627 Treasure Hunt II (贪心,模拟)的更多相关文章

  1. zoj 3627 Treasure Hunt II (贪心)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:zoj-3627 题意 直线上有n个城市, 第i个城市和i+1个城市是相邻的.  每个城市都有vi的金币.   ...

  2. zoj 3629 Treasure Hunt IV 打表找规律

    H - Treasure Hunt IV Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu ...

  3. ZOJ 3626 Treasure Hunt I 树上DP

    E - Treasure Hunt I Time Limit:2000MS Memory Limit:65536KB Description Akiba is a dangerous country ...

  4. ZOJ 3626 Treasure Hunt I(树形dp)

    Treasure Hunt I Time Limit: 2 Seconds      Memory Limit: 65536 KB Akiba is a dangerous country since ...

  5. 【ZOJ3627】Treasure Hunt II

    题目大意:给定一个长度为 N 的序列,现有两个人从 P 点出发,每个单位时间每个人最多可以移动一个单位,两人之间的最大距离不能超过 M,一共有 T 单位的时间,求在合法情况下,两人可以获得的序列点权和 ...

  6. ZOJ 3626 Treasure Hunt I (树形DP,常规)

    题意:给一棵树,一个人站在节点s,他有m天时间去获取各个节点上的权值,并且最后需要回到起点s,经过每条边需要消耗v天,问最少能收获多少权值? 思路: 常规的,注意还得跑回原地s. //#include ...

  7. zoj 3627#模拟#枚举

    Treasure Hunt II Time Limit: 2 Seconds                                     Memory Limit: 65536 KB    ...

  8. 贪心+模拟 ZOJ 3829 Known Notation

    题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...

  9. zoj Treasure Hunt IV

    Treasure Hunt IV Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is exploring the wonderland ...

随机推荐

  1. 你忘记的java的数据类型信息

    java有8种基本数据类型 int long short byte float double char boolean: 三种情况造成数据溢出 无穷大,无穷小, NAN: 常量 声明为final的变量 ...

  2. SSIS 增量更新

    本文转自 http://sqlblog.com/blogs/andy_leonard/archive/2007/07/09/ssis-design-pattern-incremental-loads. ...

  3. http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html

    http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html

  4. sass编译命令

    sass编译一个文件的方式 sass xx.scss:xx.css 这种方式只能编译一次,要是想一直监控编译,只要有保存更改就会立即编译,那么就需要下面这条命令了 sass --watch xx.sc ...

  5. mysql:视图,触发器

    一视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL 语句获取动态的数据集,并未其命名],用户使用时只需使用名称即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以吧查询过程的临时表 ...

  6. 洛谷 - P2283 - 多边形 - 半平面交

    https://www.luogu.org/problemnew/show/P2283 需要注意max是求解顺序是从右到左,最好保证安全每次都清空就没问题了. #include<bits/std ...

  7. 347. Top K Frequent Elements (sort map)

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  8. Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)

    简述 最近在用UGUI的时候遇到了鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件.比如下图中 这里给Cube加了一个鼠标点击改变颜色的代码,如下 ...

  9. jzoj5989. 【北大2019冬令营模拟2019.1.6】Forest (set)

    题面 题解 为了一点小细节卡了一个下午--我都怕我瞎用set把电脑搞炸-- 观察一次\(1\)操作会造成什么影响,比如说把\(A[i]\)从\(x\)改成\(y\): \(D[x]\)会\(-1\), ...

  10. JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常

    在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...