【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2151

【题目大意】

  在一个长度为n的数字环中挑选m个不相邻的数字使得其和最大

【题解】

  我们用大根堆和循环链表维护数字的相邻关系和删去操作,
  对于相邻点不能选取这个条件,我们在每次删去一个点之后,加入一个新的点
  权值和为周围点减去删去的点,增加反向弧,这样子就可以通过之后的选取实现退流操作
  保证答案最优。

【代码】

#include <cstdio>
#include <queue>
using namespace std;
const int N=200010;
namespace Circular_List{
bool del[N];
int n,nxt[N],pre[N],val[N];
typedef pair<int,int> P;
priority_queue<P,vector<P> > Q; // 大根堆
void Initialize(){
while(Q.size())Q.pop();
for(int i=1;i<=n;i++)pre[i]=i-1; pre[1]=n;
for(int i=1;i<=n;i++)nxt[i]=i+1; nxt[n]=1;
for(int i=1;i<=n;i++)Q.push(make_pair(val[i],i)),del[i]=0;
}
void Del(int x){
del[x]=1;
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
nxt[x]=pre[x]=0;
}
int Get(){
while(del[Q.top().second])Q.pop();
int res=Q.top().second; Q.pop();
return res;
}
}
int m;
int main(){
using namespace Circular_List;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&val[i]);
if(m>n/2){puts("Error!");return 0;}
Initialize();
int ans=0;
for(int i=1;i<=m;i++){
int x=Get();
ans+=val[x];
val[x]=val[pre[x]]+val[nxt[x]]-val[x];
Del(pre[x]); Del(nxt[x]);
Q.push(make_pair(val[x],x));
}printf("%d\n",ans);
return 0;
}

最新文章

  1. Liferay 6.2 改造系列之二十一:修改WebSphare下JSONWS服务不生效的BUG
  2. win安装mysql5.1
  3. Html - Bootstrap 头部
  4. c语言描述简单的线性表,获取元素,删除元素,
  5. Java Timer, TimerTask
  6. DLL中导出STL模板类的问题
  7. Sogou搜狗搜索引擎登录网站 - Blog透视镜
  8. FreeBsdb FAMP Lamp环境
  9. 动态修改ActionBar Menu的显示
  10. AngularJS应用开发思维之2:数据绑定
  11. The C++ Programming Language 学习笔记 第6章 表达式和语句
  12. Mac下Git安装及配置
  13. ubuntu默认启动方式修改 psensor命令
  14. C++ 单例模式(懒汉、饿汉模式)
  15. Requested a new session but one was in progress
  16. BZOJ3165: [Heoi2013]Segment(李超线段树)
  17. 关于ueditor一些使用记录
  18. Hibernate查询视图返回null问题说明及解决办法
  19. 设置linux中tcp默认的20秒connect超时时间(转)
  20. hdu3999-The order of a Tree (二叉树的先序遍历)

热门文章

  1. JavaScript验证注册信息
  2. 诺贝斯特(厦门)电气有限公司http://www.thebest.cn.com/
  3. 在c++中实现反射的初步想法
  4. 对于Linux平台下C语言开发中__sync_函数的认识(转)
  5. Python Challenge 第 2 关攻略:ocr
  6. HttpClient使用
  7. java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)
  8. python随笔(三)
  9. jQuery对象与JS原生对象之间的转换
  10. ROS + Caffe 机器人操作系统框架和深度学习框架笔记 (機器人控制與人工智能)