ギリギリ 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;
}

  

数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)的更多相关文章

  1. POJ-1456 Supermarket 销售商品【贪心】+【并查集】

    题目链接:http://poj.org/problem?id=1456 题目大意: 有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天 ...

  2. 贪心+bfs 或者 并查集 Codeforces Round #268 (Div. 2) D

    http://codeforces.com/contest/469/problem/D 题目大意: 给你一个长度为n数组,给你两个集合A.B,再给你两个数字a和b.A集合中的每一个数字x都也能在a集合 ...

  3. 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)

    传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...

  4. 数据结构与算法分析 – Disjoint Set(并查集)

    什么是并查集?并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 并查集的主要操作1.合并两个不相交集合2.判断两个元素是否属于同一集合 主要操作的解释 ...

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

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

  6. hdu 1598 (并查集加贪心) 速度与激情

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1598 一道带有贪心思想的并查集 所以说像二分,贪心这类基础的要掌握的很扎实才行. 用结构体数组储存公 ...

  7. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

  8. 数据结构 之 并查集(Disjoint Set)

    一.并查集的概念:     首先,为了引出并查集,先介绍几个概念:     1.等价关系(Equivalent Relation)     自反性.对称性.传递性.     如果a和b存在等价关系,记 ...

  9. 「LuoguP4147」 玉蟾宫(并查集

    题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...

随机推荐

  1. forward和redirect的区别(转)

    Redirect Forward 不同的request 不同的对象,但是可以渠道上一个页面的内容 send后面的语句会继续执行,除非return Forward后面的语句不会继续发送给客户端 速度慢 ...

  2. Tips for Planning Your Business Startup

    原文链接:http://domaintree.me/?p=1037 By Robert Thibodeau –  Starting a business can be a very daunting ...

  3. Log4J基础详解及示例大全

    去年这个时候,为做软件工程的大作业就详细学过Log4J的用法了,时隔一年想要在新的项目中好好使用一下的时候,发现几乎全忘了,悲催啊-- 再上网查资料,总是不能找到一篇符合我的口味,拿来就能轻松上手,方 ...

  4. 学习Linux的编码风格

    对于编码,每个码农或许都会有自己的一套风格,很多人可能对编码风格压根就不关心,因为最终编译器编译出来的目标代码并不会受影响.但是在开发一个大型项目时,花费时间成本最多的永远是开发者们之间的沟通与交流. ...

  5. 我也来谈一谈c++模板(一)

    c++中程序员使用模板能够写出与类型无关的代码,提高源代码重用,使用合适,大大提高了开发效率.此前,可以使用宏实现模板的功能,但是模板更加安全.清晰.在编写模板相关的代码是我们用到两个关键词:temp ...

  6. ios合并静态库

    lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/ ...

  7. [WPF系列]-Data Validation

    项目经常前台界面涉及到用户输入时,我们常常会用到数据有效性的验证.在网页中我们之前用js来校验Form中的数据有效性.在WPF中我们如何实现这种验证机制了?答案:INotifyDataErrorInf ...

  8. java读取excel文件

    package com.execl; import java.io.File; import java.io.FileInputStream; import java.io.IOException; ...

  9. Java — JTree and JTable以及sqlServer的两种连接

    使用JTree的步骤: 暂时只能创建一个头结点,创建一个树的结点作为头结点(其子结点也是相同的创建方法):DefaultMutableTreeNode headNode = new DefaultMu ...

  10. suid sgid sbit chattr lsattr

    suid 一般用于二进制可执行文件,suid代表当用户执行此二进制文件时,暂时具有此文件所有者的权限 chmod 4xxx binfile sgid 一般用于目录,sgid代表当其他用户在此目录下创建 ...