2011:【20CSPS提高组】贪吃蛇

时间限制: 2000 ms         内存限制: 262144 KB
提交数: 748     通过数: 189

【题目描述】

草原上有 n 条蛇,编号分别为 1,2,⋯,n。初始时每条蛇有一个体力值ai,我们称编号为 x 的蛇实力比编号为 y 的蛇强当且仅当它们当前的体力值满足 ax>ay,或者 ax=ay 且 x>y。

接下来这些蛇将进行决斗,决斗将持续若干轮,每一轮实力最强的蛇拥有选择权,可以选择吃或者不吃掉实力最弱的蛇:

1.如果选择吃,那么实力最强的蛇的体力值将减去实力最弱的蛇的体力值,实力最弱的蛇被吃掉,退出接下来的决斗。之后开始下一轮决斗。

2.如果选择不吃,决斗立刻结束。

每条蛇希望在自己不被吃的前提下在决斗中尽可能多吃别的蛇(显然,蛇不会选择吃自己)。

现在假设每条蛇都足够聪明,请你求出决斗结束后会剩几条蛇。

本题有多组数据,对于第一组数据,每条蛇体力会全部由输入给出,之后的每一组数据,会相对于上一组的数据,修改一部分蛇的体力作为新的输入。

【输入】

第一行一个正整数 T,表示数据组数。

接下来有 T 组数据,对于第 1 组数据,第一行一个正整数 n,第二行 n个非负整数表示 ai。

对于第 2 组到第 T 组数据,每组数据:

第一行第一个非负整数 k 表示体力修改的蛇的个数。

第二行 2k 个整数,每两个整数组成一个二元组 (x,y),表示依次将 ax的值改为 y。一个位置可能被修改多次,以最后一次修改为准。

【输出】

输出 T 行,每行一个整数表示最终存活的蛇的条数。

【输入样例】

2
3
11 14 14
3
1 5 2 6 3 25

【输出样例】

3
1

【提示】

【样例 1 解释】

第一组数据,第一轮中 3 号蛇最强,1 号蛇最弱。若 3 号蛇选择吃,那么它将在第二轮被 2 号蛇吃掉。因此 3 号蛇第一轮选择不吃,3 条蛇都将存活。

对于第二组数据,3 条蛇体力变为 5,6,25。第一轮中 3 号蛇最强,1 号蛇最弱,若它选择吃,那么 3 号蛇体力值变为 20,在第二轮中依然是最强蛇并能吃掉 2 号蛇,因此 3 号蛇会选择两轮都吃,最终只有 1 条蛇存活。

【样例 2 输入】

2
5
13 31 33 39 42
5
1 7 2 10 3 24 4 48 5 50

【样例 2 输出】

5
3

【数据范围与提示】

对于 20%的数据:n=3。

对于 40%的数据:n≤10。

对于 55%的数据:n≤2000。

对于 70%的数据:n≤5×104。

对于 100%的数据:3≤n≤106,1≤T≤10,0≤k≤105,0≤ai,y≤109。保证每组数据(包括所有修改完成后的)的 ai 以不降顺序排列。

代码:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1e6+100,INF=1e9;
struct Node
{int val,num;#define val(i) a[i].val#define num(i) a[i].numbool operator < (const Node y){return val==y.val?num<y.num:val<y.val;}bool operator == (const Node y){return val==y.val && num==y.num;}
}a[N];
int T,n,k,ph,pb;
queue<Node> q;
Node blank={0,0},black={INF,INF};
Node Max(Node x,Node y)
{return (x<y)?y:x;
}
Node Min(Node x,Node y)
{return (x<y)?x:y;
}
bool query(Node la)//传入上一次操作后的元素
{int cnt=0;Node bk=Min(pb<ph?a[pb+1]:black,q.size()?q.back():black);//次小元素while(1){Node hd=Max(pb<ph?a[ph]:blank,q.size()?q.front():blank);//最大元素if(a[ph]==hd)ph--;elseif(q.size())q.pop();//维护指针和队列if(hd==bk)break;//只剩两个元素,即次小元素与最大元素相等hd.val-=la.val;if(bk<hd)break;//当前最大的元素操作后不是最小的元素la=hd;cnt++;//维护指针}return cnt&1;//在第 x 次操作终止,返回 x-1 的奇偶性
}
int main()
{scanf("%d",&T);for(int i=1;i<=T;i++){if(i==1){scanf("%d",&n);for(int j=1;j<=n;j++)scanf("%d",&val(j)),num(j)=j;}else{scanf("%d",&k);for(int j=1,x,y;j<=k;j++){scanf("%d%d",&x,&y);val(x)=y;}}ph=n,pb=1;//分别为原序列最大元素和最小元素的指针while(q.size())q.pop();while(pb<=ph){Node x=Max((ph>pb)?a[ph]:blank,q.size()?q.front():blank);//最大元素if(a[ph]==x)ph--;elseq.pop();//维护指针和队列x.val-=val(pb);if(x<a[pb+1] && n-pb>1)//当前最大的元素操作后是最小的元素且剩下的元素不止一个{if(query(x))//求解是否进行本次操作pb++;break;}q.push(x);pb++;//维护指针和队列}printf("%d\n",n-pb+1);}return 0;
}

【20CSPS提高组】贪吃蛇相关推荐

  1. 【CSP2020提高组正式赛】贪吃蛇(snakes)

    [CSP2020提高组正式赛]贪吃蛇(snakes) 思路 混杂着乘法和加法时,我们发现加法会受到后面执行的乘法操作影响--具体表现就是加数乘上一个系数.这样子朴素的计算我们极大地受困于操作的顺序.因 ...

  2. 13行代码AC_2017年省赛C组蓝桥杯第一题 贪吃蛇长度(考查文件读取)

    励志用少的代码做高效表达 题目描述 ±------------------------------------------------+ | | | H###### #### | | # # # | ...

  3. Arduino提高篇26—贪吃蛇游戏

    之前文章Processing笔记05-贪吃蛇小游戏分享过如何使用Processing来实现贪吃蛇游戏,很多小伙伴问可不可以来个Arduino版本的,那么本篇就通过Arduino,配合摇杆按键和OLED ...

  4. [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)

    目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...

  5. 基于单片机的贪吃蛇游戏

    绪论 1.1 研究背景与意义 随着社会的发展,人们生活的步调日益加快,越来越多的人加入了全球化的世界. 人们不再拘泥于--,J,块天地,加班,出差成了现代人不可避免的公务.而此时一款可以 随时随地娱乐 ...

  6. 基于linux的贪吃蛇游戏设计_贪吃蛇还能这么玩?绝对是你从未体验过的全新版本(上)...

    上个月 Gitee 宣布推出「Python 贪吃蛇魔改大赛」的活动,受到了众多开发者们的欢迎.半个多月后,我们收到了共计 42 个参赛作品,有的作品创意无限,有的作品视觉效果极佳,看看下面的作品一览, ...

  7. 2017广州两日游(提高组总结)

    2017提高组总结 前言 十分激动地作为初二第一批提高组来到了广州,一路上没睡,太激动了.但美中不足的是--额,没带某些通(fu)讯(bai)工具. Day0 下午6:10左右准时发车,路上堵了一小会 ...

  8. NOIP2013 提高组复赛解题报告

    NOIP2013 提高组复赛 day1 day\;1 1002. 火柴排队 贪心+数据结构/归并排序 这个"相邻交换"让我联想到了NOIP2012_day1_task2_game那 ...

  9. 贪吃蛇还能这么玩?绝对是你从未体验过的全新版本(上)

    上个月 Gitee 宣布推出「Python 贪吃蛇魔改大赛」的活动,受到了众多开发者们的欢迎.半个多月后,我们收到了共计 42 个参赛作品,有的作品创意无限,有的作品视觉效果极佳,看看下面的作品一览, ...

  10. STM32F407基于陀螺仪的贪吃蛇小游戏(全网最详细)

    一.前言 本次设计我用MPU6050在KEIL 5的环境下改进了贪吃蛇小游戏,用的开发板是STM32F407,本次设计综合利用多种ARM外设接口实现对外部设备信息的采集.处理及显示,实现了贪吃蛇游戏实 ...

最新文章

  1. QIIME 2教程. 08差异丰度分析gneiss(2021.2)
  2. 形象标识 新松机器人_东莞市81个乡村振兴重点项目集中启用,树立统一标识牌302块...
  3. 设计模式之工厂模式(工厂方法模式 和 抽象工厂模式)
  4. @Configuration、@Bean 装配组件 与 @Resource 与 @Autowired 与 @Qualifier 、@Primary 获取组件
  5. Android 百度地图搜索框实现,仿百度地图街景实现
  6. MongoDB学习——介绍一款MongoDB连接管理工具
  7. 按头安利 好看又实用的布纹 布料贴图素材看这里
  8. Educoder jQuery 入门
  9. 用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序 - anfflee
  10. vue富媒体编辑器组件:vue-wangeditor的使用
  11. 若依项目环境搭建及使用
  12. 006-深度学习与NLP简单应用
  13. SIwave仿真手册——软件基础(一)
  14. 基于ruoyi+vue+elementUI实现列表,新增,附件上传,tab+springBoot+mybatis+oracle序列+批量新增
  15. What are Triangulation, Trilateration, and Multilateration?
  16. 0x03-无线局域网
  17. unity中使用AO贴图和自发光emission的简单应用
  18. 揭秘广告软文的五种写法
  19. 页脚设置页码(首页无页码,从第二页开始页码为1)
  20. 读书笔记--推荐系统实践(2)

热门文章

  1. pythonai人脸识别_AI的强大!用Python实现一个简单的人脸识别
  2. 计算机中的数据(原码,反码,补码)
  3. 关于代码评审(CodeReview)那些不得不说的事儿
  4. 各种数据传输总线的传输速率是多少?这些速率是如何计算出来的?数据传输的速率单位有哪些以及有哪些区别?Bps,bps,Byte/s,bit/s,kbps等等
  5. 手写签名提取工具(图片)
  6. 7-4 新浪微博热门话题 (20 分) 新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还
  7. 网络安全思维导图(全套11张)
  8. linux安装chrome浏览器(中标麒麟+龙芯CPU)
  9. 腾讯云通信音视频通话最小化悬浮小窗
  10. 计算机视觉与机械专业相关吗,计算机视觉在早期森林火灾探测中的应用研究-精密仪器及机械专业论文.docx...