2017.8.7 联考 就 贪心(有反悔策略)

【背景描述】

一排 N 个数, 第 i 个数是 Ai , 你要找出 K 个不相邻的数, 使得他们的和最大。

请求出这个最大和。

【输入格式】

第一行两个整数 N 和 K。

接下来一行 N 个整数, 第 i 个整数表示 Ai 。

【输出格式】

一行一个整数表示最大和, 请注意答案可能会超过 int 范围

【样例输入】

3 2

4 5 3

【样例输出】

7

【数据范围】

对于 20% 的数据, N, K ≤ 20 。

对于 40% 的数据, N, K ≤ 1000 。

对于 60% 的数据, N, K ≤ 10000 。

对于 100% 的数据, N, K ≤ 100000 , 1 ≤ Ai ≤ 1000000000。

solution

(别问我这个题目是什么意思...)

(再吐槽一下,long long是8字节 long long是8字节 long long是8字节,我考试按int 算的,结果MLE了.....)

(算上第二题已经 扔了150了)

60分  dp:

f[i][k] 第i个位置一定选  当前加上第i个已经选了k个

f[i][k]=max(f[i][k],f[j][k-1]+a[i])  j<i-1

枚举i 枚举k 枚举j O(n^3)

但是枚举j可以用一个数组记录下来

优化为  O(n^2)

100分  贪心+反悔(有堆维护):

我们先把每一个位置压成一个  (pos,val) 的结构体,推入堆中

然后从中取最大的 i 取k次

每取一次,就把他两边的合并起来 (已经合并过一次的可以再合并) (可以用链表)

把堆中原来的自己、左右两边的都删掉,然后把自己压成 (pos[i],val[i-1]+val[i+1]-val[i])推入堆

证明  val[i-1]+val[i+1]-val[i]:

i-1      i        i+1      x

只有当    val[i-1]+val[i+1]>val[i]+val[x]  时,才是更优的

val[i-1]+val[i+1]-val[i]>val[x]

把左式存入结构体即可

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<set>
 5 #define ll long long
 6 using namespace std;
 7 const int N=100066;
 8 const ll INF=((ll)1<<62);
 9 int intmax(int a,int b){return a>b?a:b;}
10 int intmin(int a,int b){return a<b?a:b;}
11 ll llmax(ll a,ll b){return a>b?a:b;}
12
13 struct son
14 {
15     int pos;
16     ll val;
17     son(int posss,ll valll)
18     {
19         pos=posss;val=valll;
20     }
21     friend bool operator < (son a,son b)
22     {
23         return a.val>b.val;
24     }
25 };
26 int n,kk,pre[N],nxt[N];
27 ll a[N];
28
29 set<son> q;
30 ll ans;
31
32 int main(){
33
34     scanf("%d%d",&n,&kk);
35     for(int i=1;i<=n;++i)
36     {
37         scanf("%lld",&a[i]);
38         pre[i]=i-1;nxt[i]=i+1;
39         q.insert(son(i,a[i]));
40     }
41     a[0]=-INF;
42     a[n+1]=-INF;
43     nxt[n+1]=n+1;
44     for(int i=1;i<=kk;++i)
45     {
46         int now=q.begin()->pos;
47         ans+=a[now];
48         q.erase( son(now,a[now]) );
49         a[now]=a[pre[now]]+a[nxt[now]]-a[now];
50         q.insert(son(now,a[now]));
51         if(pre[now]!=0) q.erase( son(pre[now],a[pre[now]]) );
52         if(nxt[now]!=n+1) q.erase( son(nxt[now],a[nxt[now]]) );
53
54         nxt[pre[pre[now]]]=now;
55         pre[nxt[nxt[now]]]=now;
56         pre[now]=pre[pre[now]];
57         nxt[now]=nxt[nxt[now]];
58     }
59
60     cout<<ans;
61     //while(1);
62     return 0;
63 }

code

时间: 2024-10-10 10:01:20

2017.8.7 联考 就 贪心(有反悔策略)的相关文章

【2017杭二联考】 图的有向环

P2555 - [2017杭二联考]图的有向环 Description 题目背景: 幻想乡的亡灵公主,西行寺幽幽子,在幻想乡很受欢迎,经常有妖怪来拜访她,但是幽 幽子并不喜欢被打扰,她希望从白玉楼出发,散步之后再回到白玉楼,同时路上遇到的妖怪 越少越好(有趣的是道路两边的妖怪数量并不相同,分别从两个方向经过同一条道路遇到的 妖怪数量是不同的).当然,作为冥界的公主,她是不会重复经过同一条道路的. 问题描述: 给定一个有 n 个点 m 条无向边的图,每条无向边最多只能经过一次. 对于边(ui, v

【2017杭二联考】穿越矩形

P2554 - [2017杭二联考]穿越矩形 Description 题目背景: 幻想乡的创始人之一,八云紫,有着强大的控制结界的能力,可以瞬间消除一定范围内 所有弹幕.我们可以将其消除范围视为一个矩形,而弹幕可以视为动点. 八云紫想要嘲讽她的敌人,所以她希望只使用一次消除能力,尽可能多地消除弹幕. 请你告诉她,在哪一时刻使用道具,可以消除尽可能多的弹幕. 问题描述: 在平面上给定一个矩形区域(也可能退化成线段或者点). 矩形的边与坐标轴平行,左下端 点为 (xl,yl),右上端点为 (xr,y

2017.8.7 联考 期望的一个奇怪的题 书

Hazel有n本书,编号1为n到 ,叠成一堆.当她每次抽出一本书的时候,上方的书会因重力而下落,这本被取出的书则会被放置在书堆顶. 每次有pi的概率抽取编号为i的书.她每次抽书所消耗的体力与这本书在这堆中是第几本成正比.具体地,抽取堆顶的书所耗费体力值为1 ,抽取第二本耗费体力值为2 ,以此类推. 现在 想知道,在很久很久以后(可以认为几乎是无穷的),她每次抽书所耗费的体力的期望值是多少. 最终的答案显然可以表示成a/b的形式,请输出a*(b^-1)模1e9+7的值. [输入格式] 第一行一个整

2017.8.7 联考水题 Passward kmp/hash 字符串

你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s 的后缀并且还在 s 的中间位置出现过一次. 如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个. 如果不存在这样的串,输出"Just a legend"(去掉引号). 输入格式: 仅一行,字符串 s. 输出格式: 如题所述 样例输入 fixprefixsuffix 样例输出: fix 数据范围: 对于 60%的数据, s 的

[luogu] P3745 [六省联考2017]期末考试 (贪心)

P3745 [六省联考2017]期末考试 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布. 第 \(i\) 位同学希望在第 \(t_i\)? 天或之前得知所有课程的成绩.如果在第 \(t_i\) 天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生 \(C\) 不愉快度. 对于第 \(i\) 门课程,按照原本的计划,会在第 \(b_i\)? 天公布成绩. 有如下两种操作可以调整公布成绩的时间:

P3746 [六省联考2017]组合数问题

P3746 [六省联考2017]组合数问题 \(dp_{i,j}\)表示前\(i\)个物品,取的物品模\(k\)等于\(r\),则\(dp_{i,j}=dp_{i-1,(j-1+k)%k}+dp_{i-1,j}\) \(dp_{i,0},dp_{i,1},dp_{i,2}.....dp_{i,k-1}\) \(\Longrightarrow\) \(dp_{i+1,0},dp_{i+1,1},dp_{i+1,2}.....dp_{i+1,k-1}\) 仔细想想,你能构造出矩阵的 #include

[luogu] P4364 [九省联考2018]IIIDX(贪心)

P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐游戏内一般都包含了许多歌曲,歌曲越多,玩家越不易玩腻.同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲目公开,有些曲目你需要通关某首特定歌曲才会解锁,而且越晚解锁的曲目难度越高. 题目描述 这一天,Konano 接到了一个任务

bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美味度 的边 2.负美味度区间 向 汇点 连 流量为 美味度的绝对值 的边 3.区间[i,j] 向 区间[i+1,j].区间[i,j-1] 连 流量为 inf 的边 4.区间[i,i] 向 寿司i 连 流量为 inf 的边 5.寿司i 向 汇点 连 流量为 寿司代号 的边 6.寿司i 向 它的代号 连

bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿

http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关至多操作1次,(连带着的灯的亮灭改变不算) 设最优解 需要操作cnt次,那么就有cnt盏灯是正确的选择 设 f[i] 表示 有i种正确的选择  变为 有i-1种正确的选择 的 期望次数 那么在n盏灯中,有i盏灯操作1次 就可以 减少一次正确选择 有n-i盏灯是错误的选择,选了它还要把它还原,还原它也