链接:HDU - 6444

题意:给出一个包含 n 个数的环,每个数都有一个价值,起点任选,每次跳顺时针跳 k 个数,在哪个数就能获得该价值(包括起点),最多取 m 次,问最少需要补充多少价值,所拿的价值和才能大于等于 s 。

题解:从不同起点出发会获得很多不同的环,将每个环取出来讨论。

1.环的总价值和小于等于0,那么表示跑再多圈也没用,求一段长度不大于 min(m, 圈长) 的最大区间和即可。

2.环的总价值和大于0,那么多跑一圈价值就大一点,就尽量多跑几圈就可以了,但是最后一个满圈是个坑点,最优解可能不跑完最后一个满圈,需要注意。

#include <bits/stdc++.h>
using namespace std; const double EPS = 1e-;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
const int maxn = 1e5 + ;
long long n, s, k;
int m;
long long sum[maxn], a[maxn], num[maxn];
vector<long long> v[maxn];
set<int> st;
list<long long> Q; long long Cal(long long a[], int n, int k)
{
for(int i = ; i <= n; i++) sum[i] = sum[i - ] + a[i - ]; Q.clear(); Q.push_back(); long long ans = ;
for(int i = ; i <= n; i++){
while(!Q.empty() && sum[Q.back()] > sum[i]) Q.pop_back();
Q.push_back(i); while(!Q.empty() && i - Q.front() > k) Q.pop_front();
int j = Q.front(); ans = max(ans, sum[i] - sum[j]);
} return ans;
} int main()
{
int T, cas = ;
scanf("%d", &T);
while(T--){
scanf("%lld%lld%d%lld", &n, &s, &m, &k); st.clear();
for(int i = ; i < n; i++){
scanf("%lld", &a[i]);
st.emplace(i);
} int cnt = ;
while(!st.empty()){
num[cnt] = ;
v[cnt].clear();
int x = *st.begin();
while(st.count(x)){
st.erase(x);
v[cnt].push_back(a[x]);
num[cnt] += a[x];
x = (x + k) % n;
}
cnt++;
} long long ans = ;
for(int i = ; i < cnt; i++){
int N = v[i].size();
for(int j = ; j < N; j++) a[j] = a[j + N] = v[i][j]; if(num[i] <= ){
ans = max(ans, Cal(a, N << , min(N, m)));
}
else{
int d = m / N;
int r = m % N; if(d > ){
long long mx1 = Cal(a, N << , N);
long long mx2 = Cal(a, N << , r); if(mx1 > mx2 + num[i]) ans = max(ans, (d - ) * num[i] + mx1);
else ans = max(ans, d * num[i] + mx2);
}
else ans = max(ans, Cal(a, N << , r));
}
} if(ans >= s) ans = ;
else ans = s - ans; printf("Case #%d: %lld\n", cas++, ans);
} return ;
}

HDU - 6444(单调队列+思维)的更多相关文章

  1. HDU 3507 单调队列 斜率优化

    斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...

  2. hdu 3530 单调队列最值

    /** HDU 3530 单调队列的应用 题意: 给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k. 解题思路: 建立两个单调队列分别递增和递减维护(头尾删 ...

  3. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  4. hdu 3415(单调队列) Max Sum of Max-K-sub-sequence

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3415 大意是给出一个有n个数字的环状序列,让你求一个和最大的连续子序列.这个连续子序列的长度小于等于k. ...

  5. hdu 3401 单调队列优化+dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  6. hdu 3415 单调队列

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. HDU 2191 - 单调队列优化多重背包

    题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...

  8. HDU 3530 单调队列

    题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...

  9. HDU 4122 单调队列

    转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...

随机推荐

  1. 在网页中使用Markdown

    在网站中使用markdown有两种方式,一种是通过后端(php等)把markdown语法文本转换为html代码,输出到浏览器:另一种是通过javascript代码直接在浏览器中转换. 我在这里使用的是 ...

  2. 最长公共子序列问题LCS

    最长公共子序列问题 在这里介绍一种在动态规划中类似于板子题的类型 : 最长公共子序列问题.(Link) 首先来看题面:给出1-n的两个排列P1和P2,求它们的最长公共子序列. 我们看到题之后的第一个想 ...

  3. Flex控件之repeater和radioButton应用

    代码:http://www.cnblogs.com/modou/articles/2108346.html <?xml version="1.0" encoding=&quo ...

  4. Java IP白名单相关工具类

    关于设置IP白名单相关的一些方法,整理,记录了一下. package com.tools.iptool; import java.util.ArrayList; import java.util.Ha ...

  5. 使用canvas输出base64_url

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. OC录制小视频

    OC录制小视频 用 AVCaptureSession + AVCaptureMovieFileOutput 来录制视频,并通过AVAssetExportSeeion 手段来压缩视频并转换为 MP4 格 ...

  7. ORACLE GOLDEN GATE oracle同步数据至kafka

    一.服务器信息 ip   软件版本 ogg版本 软件包 操作系统版本 OGG安装路径 10.1.50.52 源 oracle11.2.0.4 12.2.0.1.1 V100692-01.zip cen ...

  8. 记一次MySQL中Waiting for table metadata lock问题的处理

    起因:由于需要,要把一张表的一个字段从不是 null 改成 可null,我用的Navicat Premium ,但是在保存的时候,工具无响应了,几个同事操作都是这样的,很奇怪,怀疑是不是由于表被锁了还 ...

  9. 第一课、安装登录CentOS7

    一.学习之初 1.学习这个课程的目的是,高薪就业,搞运维. 2.应该在宁波发展. 3.大概给自己定的计划是4个月能学习2遍. 4.学好之后就跳槽. 5.2年左右的时间要达到1.5W争取. 学习方法: ...

  10. MySQL---正确使用索引、limit分页、执行计划、慢日志查询

    正确使用索引 数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效.即使建立索引,索引也不会生效: - like '%xx' se ...