CodeVs 1615 数据备份
题目:数据备份
链接:Here
题意:有n个点在一条线上,每次连线可以连接两个点(每个点只能被连一次),要求找出m个连线,他们的和最小(连线权值就是两点距离),输出最小的和。给出n、m和每个点的坐标。
思路:
可反悔贪心。
容易得出连线必然是选择相邻的点组成,那么从连线权值最小的开始选(用优先队列实现),假设现在有6个连线(1、2、3、4、5、6),如果第一次选了3,但后面有可能发现w[3] + w[x](后面找到的一个满足条件的权值最小的连线)> w[2] + w[4](正常情况下选了3,就不可以选择2、4了),那么我可以反悔,重新选择2、4而抛弃3,要想做到这样,在把w[3]算入总和时,得把w[2]+w[4]-w[3]放入优先队列,以供日后反悔,基于假设,w[2]+w[4]-w[3]<w[x],那么先出来的就是w[2]+w[4]-w[3],此时sum+w[2]+w[4]-w[3]和最初选了2、4的结果一致,当然,在把w[2]+w[4]-w[3]算入总和时,得把这一块的左边连线w[1]与右边连线w[5]再结合,也就是w[1]+w[5]-(w[2]+w[4]-w[3]),放入优先队列,以供后面可以反悔。容易得到这个贪心是正确的。
AC代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
#define N 100010
#define M 100010
#define Mod 1000000007
#define LL long long
#define INF 1000000007
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define For(i,f_start,f_end) for(int i=f_start;i<f_end;i++)
#define REP(i,f_end,f_start) for(int i=f_end;i>=f_start;i--)
#define Rep(i,f_end,f_start) for(int i=f_end;i>f_start;i--)
#define MT(x,i) memset(x,i,sizeof(x))
#define gcd(x,y) __gcd(x,y)
const double PI = acos(-); struct Node
{
int w,l,r,pos;
bool friend operator < (Node a,Node b)
{
return a.w>b.w;
}
}w[N]; bool vis[N];
priority_queue<Node> q; int main()
{
int n,k;
scanf("%d%d",&n,&k);{
int pre = ;
FOR(i,,n){
scanf("%d",&w[i].w);
int tmp = w[i].w;
w[i].w -= pre;
pre = tmp; w[i].pos = i;
w[i].l = i-;
w[i].r = i+;
}
w[].l = w[n].r = ; //while(q.size()) q.pop();
FOR(i,,n){
q.push(w[i]);
}
int sum = ;
FOR(i,,k){
Node tmp;
while(q.size()){
tmp = q.top();
q.pop();
if(tmp.w == w[tmp.pos].w) break;
}
//printf("%d %d %d %d\n",tmp.l,tmp.r,tmp.pos,tmp.w);
tmp = w[tmp.pos];
sum += tmp.w;
Node now;
now.pos = tmp.pos;
now.l = w[tmp.l].l;
now.r = w[tmp.r].r;
w[now.l].r=now.pos;
w[now.r].l=now.pos; if(tmp.l== || tmp.r==) now.w=INF;
else now.w = w[tmp.l].w + w[tmp.r].w - tmp.w;
w[now.pos]=now; //printf("===%d %d %d %d\n",now.l,now.r,now.pos,now.w);
w[tmp.l].w = INF;
w[tmp.r].w = INF;
q.push(now);
}
printf("%d\n",sum);
}
return ;
}
CodeVs 1615 数据备份的更多相关文章
- 数据备份的OSS接口
最近在做一个新的项目,从RDS备份到OSS,进行数据备份以及后续的还原.这边对阿里云的OSS数据上传接口进行说明,先做下笔记先简单介绍下OSS: ①Object 在OSS中,用户操作的基本数据单元是O ...
- 两种适用于中小量数据的mysql数据备份
近来项目的业务量开始大了,感觉如果数据不周期性地备份一下,很可能会出现问题,虽然我每天都有阿里云的自动快照,上网找了一下方法,找到两种相对简单而又适合中小项目或者中小公司的数据备份策略,以下都是数据库 ...
- redis主从复制 从而 数据备份和读写分离
蜗牛Redis系列文章目录http://www.cnblogs.com/tdws/tag/NoSql/ 爬虫转载注明地址本文地址—博客园蜗牛 http://www.cnblogs.com/tdws/p ...
- MySQL 数据备份与还原
一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先 ...
- 转 MySQL 数据备份与还原
MySQL 数据备份与还原 原贴:http://www.cnblogs.com/kissdodog/p/4174421.html 一.数据备份 1.使用mysqldump命令备份 mysqldum ...
- Linux文件系统应用---系统数据备份和迁移(用户角度)
1 前言 首先承诺:对于从Windows系统迁移过来的用户,困扰大家的 “Linux系统下是否可以把系统文件和用户文件分开到C盘和D盘中” 的问题也可以得到完满解决. 之前的文章对Linux的文 ...
- 开源服务专题之-------rsync数据备份
RSYNC是Remote Sync 远程同步的简称,与SCP的比较,SCP= 无法备份大量数据,类似windows的复制,而rsync=边复制 ,边统计,边比较,可以备份大量数据.可以镜像保存整个目录 ...
- Oracle数据备份bat
@echo on setlocal rem 设置数据库和备份文件参数... set sid=testorcl set username=testname set password=testpwd se ...
- Bzoj1150 数据备份Backup
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
随机推荐
- java_List集合及其实现类
第一章:List集合_List接口介绍 1).特点 1).有序的: 2).可以存储重复元素: 3).可以通过索引访问: List<String> list = new Arra ...
- 【转】Android必备知识点- Android文件(File)操作
Android 使用与其他平台上基于磁盘的文件系统类似的文件系统. 本文讲述如何使用 Android 文件系统通过 File API 读取和写入文件. File 对象适合按照从开始到结束的顺序不跳过地 ...
- ELK 日志采集 实战教程
概要 带着问题去看教程: 不是用logstash来监听我们的日志,我们可以使用logback配置来使用TCP appender通过TCP协议将日志发送到远程Logstash实例. 我们可以使用Logs ...
- json 按照字段分类
let arr = [ { Category:'A', Amount:, },{ Category:'B', Amount:, },{ Category:'A', Amount:, },{ Categ ...
- vue点击按钮给商品按照价格进行倒叙
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android开发,关于如何在应用间共享SharedPreference
开发一个应用,需要用到两个应用A和B之间共享数据的问题,这个数据是个单一的数据,所以就想用SharedPrefernce来进行保存. 使用网上的各种应用间的共享代码,B是读取A的数据,所以代码为: C ...
- 预置第三方apk到MTK项目相关问题总结
目前5.0之后项目预置方式通用步骤为: 建立apk文件夹; 置目标apk到该文件夹下; 解压缩apk查看是否包含lib/文件夹(apk项目是否包含lib库文件); 在该文件夹下编写Androi ...
- 如何利用Vagrant快速搭建相同配置的开发环境?
作为一名程序猿,我们常常会遇到需要搭建开发环境的问题,特别是在新入职的时候,sublime, node, apache, mysql, php等等以及各种框架的安装.如果入职的是大公司有可能这些必要的 ...
- Docker Data Center系列(二)- UCP安装指南
本系列文章演示如何搭建一个mini的云平台和DevOps实践环境. 基于这套实践环境,可以部署微服务架构的应用栈,演练提升DevOps实践能力. 1 系统要求 1.1 硬件和软件要求 Linux内核版 ...
- go语言打造个人博客系统(二)
go语言打造个人博客系统(二) 在上篇文章go语言打造个人博客系统(一)中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发. 博客系统后端接口开发 路由测试 ht ...