ギリギリ eye

Description

A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面对强大的异星人势力 ,用“文化的力量”寻找生存之道,一方面向着银河系进行移民而寻求新天地。西历 2067 年,银河系边境行星的中心、失去自我而狂暴化的“Bajura”症候群扩大化。眼见事态严重,星间复合企业体为控制症状,以少女们的“战术音乐组合 walküre”与共同作战的“Valkyrie 部队”一起集结。

小风,作为战术音乐组合 walküre 的预备队中的一员,迎来了他的转正试炼!当试炼开始(第 1 个单位时间)时,将会有大量的靶机同时飞起,每一架靶机都有各自的速度和分数(可能相同),其中速度用飞离射击范围的时间来描述。然而,因为试炼用火炮比较老旧,每个单位时间只能射击一发,并不是所有的靶机都能被击落,所以能得到的最高分也不是所有靶机的分数总和。不过由于小风强!无敌他弹无虚发,一炮一个,非常轻松的就拿到了能得到的最高分,现在问题来了,这个最高分是多少呢?PS:配合 BGM: いけないボーダーライン食用此题口感更佳

Input

第一行一个正整数 N, N 最大不超过 1000000
接下来 N 行,每行两个整数 T, V,第 i 行表示第 i-1 号靶将会在 T 时刻后飞出射击范围,击落该靶机能够获得 V 的得分。保证 T 最大不超过 700000.

Output

输出一个正整数,保证答案在 INT 范围。

Sample Input

71 61 73 23 12 42 56 1

Sample Output

15

思路

方法一:为了使得获得的分数最高,那么应该从靶机中时间最长的往前推,这样能保证打尽量多的靶机;推进的过程,当有在当前时刻截止的靶机,则将他们全部放入优先队列里面,然后从中选出获得价值最大的靶机,如果在当前时刻没有截止的靶机,则从优先队列中选出获得最大价值的靶机。

方法二:按照价值从大到小排列,每次选出能获得最大价值的靶机,将其放在截止时刻打击,并做好标记,如果其截止时刻已经有过标记,则从截止时刻往前推,找出一个可以打击的时刻。查找的过程可以用并查集优化。假设一个产品a占用了一个日期后,那么如果下次又有一个产品b和产品a的截止日期是相同的,但是那个日期以被占用了,所以就要往前移动1天,那么就可以用并查集进行标记,在a占用了那个日期后,把a的截止日期指向前一个日期,这样的话,可以直接查找到他要占用到哪一个时间。

 AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000005;
struct Edge
{int t,v,nxt;
} edge[maxn];
int sz = 0,tot = 0,head[maxn],heap[maxn];void push(int x)
{int i = sz++;while (i > 0){int p = (i - 1) / 2;if (heap[p] >= x)    break;heap[i] = heap[p];i = p;}heap[i] = x;
}int pop()
{int ret = heap[0];int x = heap[--sz];int i = 0;while (2*i+1 < sz){int a = i*2 + 1,b = i*2 + 2;if (b < sz && heap[b] > heap[a])    a = b;if (heap[a] <= x)    break;heap[i] = heap[a];i = a;}heap[i] = x;return ret;
}void addedge(int t,int v)
{edge[tot].v = v,edge[tot].t = t,edge[tot].nxt = head[t];head[t] = tot++;
}int main()
{int N,i,j;scanf("%d",&N);int v,t,maxt = 0,res = 0;tot = 0,sz = 0;memset(head,-1,sizeof(head));memset(heap,0,sizeof(heap));for (i = 0; i < N; i++){scanf("%d%d",&t,&v);addedge(t,v);if (t > maxt)  maxt = t;}for (i = maxt; i > 0; i--){if (head[i] != -1){for (j = head[i]; j != -1; j = edge[j].nxt){push(edge[j].v);}res += pop();}else if (sz > 0){res += pop();}}printf("%d\n",res);return 0;
}

  

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN = 1000005;
int p[MAXN];
struct N
{int p, d;  bool operator < (const N& t)const  {  return p > t.p;  }
}a[MAXN];  int find(int x)
{  return p[x] == x ? x : p[x] = find(p[x]);
}  int main()
{  int n,i;  scanf("%d", &n)  ;  int ans = 0;  for (i = 0; i <= MAXN; ++i) p[i] = i;  for (i = 0; i < n; ++i)  scanf("%d%d", &a[i].d, &a[i].p);  sort(a, a + n);  for (i = 0; i < n; ++i)  {  int tmp = find(a[i].d);  if (tmp > 0)  {  p[tmp] = tmp - 1;  ans += a[i].p;  }  }  printf("%d\n", ans);  return 0;
}

  

转载于:https://www.cnblogs.com/ZhaoxiCheung/p/6043702.html

数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)相关推荐

  1. 【POJ - 1456】Supermarket (贪心,优先队列 或并查集)

    题干: A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod s ...

  2. 【杭电多校2020】Total Eclipse【贪心】【并查集】

    题意:nnn个点mmm条边的无向图,每个点有一个正点权,每次选择一个连通子图,将里面的权值都减111.求所有点权为000的最小步数. T≤10,n≤105,m≤2×105T\leq 10,n\leq ...

  3. 【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】

    题意:一个魔塔游戏的地图是一棵以 111 为根的树,起点为根,除根外每个结点有一个怪物,给定每个怪物血量.攻击.防御.奖励蓝宝石个数(加防御),勇士的血量.攻击.防御,遇到怪物必须战斗,勇士永远先手, ...

  4. 【数据结构与算法】森林版并查集V1.0的Java实现

    并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题近几年 ...

  5. 数据结构(二)——Trie、并查集、堆

    前言 重学算法第5天,希望能坚持打卡不间断,从基础课开始直到学完提高课. 预计时长三个月内,明天再来!肝就完了 2月17日,day05 打卡 今日已学完y总的 算法基础课-2.3-第二章 数据结构(二 ...

  6. [数据结构、读书笔记、C++] 并查集详解

    介绍 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的 合并及查询 问题. 其主要操作为: Union(合并) :将两个节点所在集合合并为一个集合 Find (查询) ...

  7. 数据结构之树的应用:并查集

    树的应用:并查集 并查集的概念: 三种基本操作: 例: 代码实现: 并查集的概念: 将所有的数据元素放在一个集合中,将集合分成若干个互不相交的子集,每一个子集对应一颗树,所有的自己组成森林. 三种基本 ...

  8. 【数据结构和算法笔记】用并查集求解等价关系

      模板: class UF { private:vector<int>father;//father数组vector<int>rank;//秩int count;//连通分支 ...

  9. 数据结构作业——Sanji(优先队列)

    山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...

最新文章

  1. c语言零基础快速入门,C语言几种循环结构—零基础小白快速入门必学
  2. Android 对话框(Dialog)大全
  3. PHP同时连接多个mysql数据库_php如何同时连接多个数据库
  4. python真的很厉害吗-学会Python后都能做什么?网友们的回答简直不要太厉害
  5. MR21批量修改物料价格-BDC
  6. “make -n”和 “+command”的解释
  7. linux怎么创建扩展分区,Linux磁盘创建扩展分区
  8. 2012-01-10 自己写的基于jquery的翻页效果
  9. 开发Eureka Server
  10. ios FMDB数据库添删改查应用
  11. 持续集成、持续交付(CI/CD)开篇,先来唠唠嗑
  12. 安装Linux操作系统完成必做几件事
  13. 【Redis学习笔记】2018-06-14 Redis源码学习之sentinel
  14. HierarchicalDataTemplate中的ContextMenu的Command绑定
  15. Tensor:归并操作
  16. 硬件电路设计之按键消抖(利用瞬态抑制二极管TVS加低通滤波器)
  17. EXCEL:转换人民币大写
  18. python写身份证_python 关于身份证号码的相关操作
  19. iPhone最强悍对抗者——HTC崛起的秘密 1
  20. java rmi端口_RMI IP绑定和端口固定

热门文章

  1. linux批量命令换行,Linux 下的这些高效指令,是你快速入门运维的神器
  2. sql数据库去重语法_浅谈sql数据库去重_MySQL
  3. Java Scheduler ScheduledExecutorService ScheduledThreadPoolExecutor示例
  4. java在数组中放入随机数_如何在Java中随机播放数组
  5. rxjava教程_RxJava教程
  6. Python字符串endswith()
  7. Android RxJava和改造
  8. python locals_Python locals()
  9. gitbook安装与使用
  10. java中int和Integer对比的一些坑