题的连接
2014年的压轴题,又是模拟(话说为什么最近做了这么多模拟)。总之又是被无数细节给坑了,不过最后结果不错,我这个算法还是挺快的。
还是先说说想法,一看到这题的范围,觉得应该不会超时,比较烦的是标记的这个问题,因为如果每轮都要把标记的人算一次的话怕会超时,不过在看到了饭量最大为5之后我打消了这个顾虑,不过我还是没有使用常规的方法(导致因为一个细节错了不少次)。我的想法是因为标记之后死亡的时间是固定的(当然最后发现不尽然),所以只要用一个优先队列储存死亡时间和死亡标号即可,因为我的处决机制使得我不拍鞭尸(重复处决),所以即使重复标记也不怕,然后其他的吃饭就都用一个chek函数搞定就行了。
具体实现的时候被各种细节问题给坑了
1首先构造一组数组列表,把该存的东西都存了,至于两种属性我单开了两个pair类型的set进行储存,这样消除也比较简单
2然后是卡片的问题,这一步出了一个问题,就是我这么每轮输入一个的话有可能会因为提前结束而导致输入的内容不足而影响接下来的结果,所以我修修补补了一下(其实事先用一组数组储存更简单,就是浪费一小点空间)。
3接下来是一个重点,我们要根据选择的卡片进行行动,首先如果要吃饭的就把相应的编号放进chek里处理即可,如果现在的编号被干掉了就把编号给前一个,这样可以保证所有在这个环里的人都是活着的而且每次向右都是正确的下一个。处理完chek我们处理因为诅咒而需要被处决的人,首先进行循环把这些人拉出来一个个干掉,不过这里遇到了困扰了我很久的一个问题,就是如果这一步是被标记的就不会有人吃饭,诅咒的也不需要,其实就相当于被续了一秒,不过只要加入一个小机制就可以了,首先我们用一个变量biao记录标记的次数,这样每次被标记biao就加一,然后在判断是否死亡的时候还要加入biao的数量,因为有一些可能是后来加入的所以只要让死亡时间的部分减去之前(包括自己)标记的数量这样到时候判断加上的就是后来标记的数量了。
最后贴代码
# include <stdio.h>
# include <algorithm>
# include <set>
# include <queue>using namespace std;struct man
{int ea, y, z;int lct, rct;
};typedef pair<int , int> P;const int MAX_N = 1005;bool die[MAX_N];
int T, N, M, now, num;
man stu[MAX_N];
set<P> Y, Z;void det(int n)
{if(die[n])return;num--;Y.erase(P(stu[n].y , n));Z.erase(P(stu[n].z , n));stu[stu[n].lct].rct = stu[n].rct;stu[stu[n].rct].lct = stu[n].lct;die[n] = true;if(n == now)now = stu[n].lct;
}inline void chek(int n)
{stu[n].ea--;if(stu[n].ea <= 0)det(n);
}void solve()
{fill(die , die + N , 0);now = 0;num = N;int b = 0;priority_queue<P , vector<P> , greater<P> > que;int i;if(N <= 1){for(i = 0 ; i < M ; i++)scanf("%d", &now);printf("%d\n", N);return;}for(i = 0 ; i < M ; i++){int c;scanf("%d", &c);if(c == 1)chek((*Y.begin()).second);else if(c == 2)chek((*Z.begin()).second);else if(c == 3){b++;que.push(P(i + stu[now].ea - b , now));}else if(c == 4)chek(stu[now].lct);else if(c == 5)chek(stu[now].rct);else chek(now);while(!que.empty()){P ty = que.top();if(ty.first + b > i)break;que.pop();det(ty.second);}int j;if(num == 1){for(j = i + 1 ; j < M ; j++)scanf("%d", &c);printf("%d\n", now + 1);return;}else if(num == 0){for(j = i + 1 ; j < M ; j++)scanf("%d", &c);puts("0");return;}now = stu[now].rct;}puts("-1");
}int main()
{scanf("%d", &T);while(T--){Y.clear();Z.clear();scanf("%d %d", &N, &M);int i, ny, nz;for(i = 0 ; i < N ; i++)scanf("%d", &stu[i].ea);for(i = 0 ; i < N ; i++)scanf("%d", &stu[i].y);for(i = 0 ; i < N ; i++)scanf("%d", &stu[i].z);for(i = 0 ; i < N ; i++){stu[i].lct = i - 1;stu[i].rct = i + 1;Y.insert(P(stu[i].y , i));Z.insert(P(stu[i].z , i));}stu[0].lct = N - 1;stu[N - 1].rct = 0;solve();}return 0;
}

【xdoj难题集】1039: 饭桌上的游戏相关推荐

  1. 【xdoj难题集】1202 The Offer - Lunatic(附优化版)

    说实话2017年的校赛挺难的,最后三道都不简单,这道题一开始吓了我一大跳,想着如果用最短路算法,魔法阵怎么也要上千万条路径,不过之后看到海拔最高只有100之后总算是安心了. 先说一说大体思路,首先肯定 ...

  2. 【xdoj难题集】1102 xry111挂灯笼

    题目 这道题虽然做对的不多,但是我倒是做的异常顺利,直接一遍过,感觉在经历了pfunction之后已经领悟了新一层的dp技巧. 说说思路,就是dp递推,关键是掌握如何递推,首先考虑只有一个挂钩的情况, ...

  3. 【xdoj难题集】 1059: 英雄联盟

    题目链接 这道题做了有一阵了,之前一直不知道是什么问题,今天又回头看了看,试了试精度,发现之前的如果末尾是5会无法进位,改完之后就对了...精度真的是玄学问题,这个问题一定要重视,还是要积累一些经验. ...

  4. 【xdoj难题集】 1018 Josephus环的复仇的复仇

    题目链接 每天都坚持写写 说实话很早就想写这道题了,但是一直不知道怎么解释那个算法,做完之后也看过聚聚的题解,说有一个什么数学结论,然而我研究了这么久都没有研究出什么数学结论,只能再试着看看了.虽然之 ...

  5. 《为iPad而设计:打造畅销App》——想象iPad上的游戏

    本节书摘来自异步社区<为iPad而设计:打造畅销App>一书中的想象iPad上的游戏,作者[英]Chris Stevens,更多章节内容可以访问云栖社区"异步社区"公众 ...

  6. 帝国时代3 亚洲王朝 酋长合集 Mac版 – 即时战略游戏

    <帝国时代3>是一款由Ensemble Studios开发的即时战略游戏,它向玩家展示了不同民族风格迥异的经济体制和作战方式.<帝国时代3>的原版游戏从公元1500年开始,玩家 ...

  7. 围棋——金字塔上的游戏

    围棋--金字塔上的游戏 楔子 我们已经习惯了把围棋盘看成是平面的,因为根本没有必要去把它设想为立体的.可是当我们认真地考虑围棋的内在机理和围棋规则的内涵时,似乎应当做一种视角的变换. 可以发现,围棋盘 ...

  8. 亚马逊云科技云上的游戏服务:Lumberyard + Amazon GameLift + Twitch

    开发一款世界级的游戏是一个非常困难,耗时和昂贵的过程.现在的游戏玩家要求越来越苛刻,他们希望既可以通过各种不同的终端设备来进行游戏 ,又要求游戏具有社交的功能.由于此类游戏的开发期和推广期都很长,因此 ...

  9. AWS上的游戏服务:Lumberyard + Amazon GameLift + Twitch

    开发一款世界级的游戏是一个非常困难,耗时和昂贵的过程.如今的游戏玩家要求越来越苛刻,他们希望既能够通过各种不同的终端设备来进行游戏 ,又要求游戏具有社交的功能. 因为此类游戏的开发期和推广期都非常长. ...

最新文章

  1. java web程序示例_想要建立一些有趣的东西吗? 这是示例Web应用程序创意的列表。...
  2. 430亿晶体管,1020万逻辑单元,英特尔发布全球最大容量FPGA,用全新硬件加速AI开发...
  3. 北科大matlab,北科大matlab第五次作业多项式及其相关计算.doc
  4. 信息学奥赛一本通 1001:Hello,World | OpenJudge NOI 1.1 01:Hello, World
  5. CentOS 7下彻底卸载MySQL数据库
  6. 【重点 递归构造二叉树】LeetCode 95. Unique Binary Search Trees II
  7. Vue2.x全家桶WebApp
  8. ubuntu安装libjasper.so.1,libpng12.so.0
  9. 编程基本功:以输入法为例,谈谈测试案例的设计
  10. 黑域,黑阈 Permission denied
  11. 计算机total函数,以一敌十的SUBTOTAL函数,你不会用就太可惜了!
  12. python写一个简单的CMS识别
  13. 机器学习算法(三十):强化学习(Reinforcement Learning)
  14. 一文读懂SDRAM内存模组与基本概念
  15. iOS开发中图片的模糊处理
  16. Linux 安装netcdf
  17. iOS14隐私适配:根据不同的场景需求设置不同的定位精确度
  18. 遍历HashMap的几种常用方法
  19. java绘制流程图基本元素,java绘制图片
  20. java eden_java eden 大小

热门文章

  1. 皇家恩菲尔德子弹500经典男装
  2. python 处理数据类型data_python数据类型之pandas—DataFrame
  3. 金蝶K3 WISE 14.3版本增加用户账号
  4. lcg_magic算法笔记:堆排序
  5. 世界上最远的距离 ——泰戈尔
  6. 家庭版安装DotNetFX35
  7. 小熊派4G开发板初体验SDK开发
  8. JuiceFS 在数据湖存储架构上的探索
  9. google 天气rss
  10. 访问虚拟机上的本地网站