【NOIP2014模拟11.6】射击

2023-10-07 15:40
文章标签 模拟 射击 noip2014 11.6

本文主要是介绍【NOIP2014模拟11.6】射击,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

https://jzoj.net/senior/#contest/show/2045/1

小结

这题是一个我不是很熟悉的堆。
首先,堆就是一个完全二叉树,可以把它抽象成这样:
这里写图片描述
对于对的操作,我们可以用up 和down 来维护
下列是up 和 down。(详解请看本作者的【专题】堆)
up:

procedure up(k:longint);
beginwhile(k>1)and(a[k]<a[k div 2])dobegina[0]:=a[k];a[k]:=a[k div 2];a[k div 2]:=a[0];k:=k div 2;end;
end;

down:

procedure down(x:longint);
vary,k:longint;
beginwhile (x*2<=tot)and(a[x]>a[x*2])or(x*2+1<=tot)and(a[x]>a[x*2+1]) dobeginy:=x*2;if(y+1<=tot)and(a[y]>a[y+1])then inc(y);k:=a[x];a[x]:=a[y];a[y]:=k;x:=y;end;
end;

我们用样例来演示一下具体操作:
样例是:
4
1 19
2 10
1 20
2 15
输出:35
排序成:
1 19
1 20
2 10
2 15
首先在堆中加入一个19。
这里写图片描述
然后时间就到了t=1;
我们发现第二个数的时间要比t+1要小了,那就看看堆顶的和它比较,如果可以,就交换。
变成这样。
这里写图片描述
然后维护下一组,继续t=1;
然后我们发现,下一个是可以的,就把它加入堆中:
这里写图片描述
再用up维护一下:
这里写图片描述
然后发现t=3;
下一个不行,于是就用堆顶来维护,
这里写图片描述
这里写图片描述
再用down操作维护一下,但是还是同样。
于是最后答案就是堆里的所有元素之和=35;

vara,p,q,r1,r2:array[0..200000]of int64;i,j,n,m,tot:longint;ans,t:int64;
procedure up(k:longint);
beginwhile(k>1)and(a[k]<a[k div 2])dobegina[0]:=a[k];a[k]:=a[k div 2];a[k div 2]:=a[0];k:=k div 2;end;
end;
procedure down(x:longint);
vary,k:longint;
beginwhile (x*2<=tot)and(a[x]>a[x*2])or(x*2+1<=tot)and(a[x]>a[x*2+1]) dobeginy:=x*2;if(y+1<=tot)and(a[y]>a[y+1])then inc(y);k:=a[x];a[x]:=a[y];a[y]:=k;x:=y;end;
end;
procedure dg(f,e:longint);
varm,i,j,k:longint;
beginif f=e then exit;m:=(f+e) div 2;dg(f,m);dg(m+1,e);i:=f;j:=m+1;k:=f;while (i<=m) and (j<=e) dobeginif p[i]<p[j] thenbeginr1[k]:=p[i];r2[k]:=q[i];inc(i);inc(k);endelsebeginr1[k]:=p[j];r2[k]:=q[j];inc(j);inc(k);end;end;while i<=m dobeginr1[k]:=p[i];r2[k]:=q[i];inc(i);inc(k);end;while j<=e dobeginr1[k]:=p[j];r2[k]:=q[j];inc(j);inc(k);end;for i:=f to e dobeginp[i]:=r1[i];q[i]:=r2[i];end;
end;
beginassign(input,'1.in');reset(input);readln(n);for i:=1 to n doreadln(p[i],q[i]);dg(1,n);t:=0;for i:=1 to n dobeginif(q[i]<=0)or(p[i]=0)then continue;if p[i]>t thenbegininc(t);inc(tot);a[tot]:=q[i];up(tot);endelsebeginif a[1]<q[i] thenbegina[1]:=q[i];down(1);end;end;end;for i:=1 to tot doans:=ans+a[i];writeln(ans);
end.

这篇关于【NOIP2014模拟11.6】射击的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/158743

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

AMAZING AUCTION(简单模拟)

AMAZING AUCTION 时间限制: 3000 ms  |  内存限制: 65535 KB 难度:4 描述 Recently the auction house hasintroduced a new type of auction, the lowest price auction. In this new system,people compete for the lo