目录

原题

参考代码1:(可以运行,但是无法完全通过PTA)

简化的题目

参考代码2:(能通过PTA)


pta上做到了这题,先来看看题目

——————————————————————————————————————————

原题

这天小H和小W决定去森林看日出,他们来到森林里。走着走着,他们发现了一块发着神秘光芒的石头。他们很迷惑,于是打开淘宝拍照识图,啊妹子啊(Amazing)!,这居然是块魔法石,通过上知网他知道这块石头总是出现在成堆出现,因此附近应该有更多。然后他更深入了。不出所料,他发现了许多魔法石。这些石头排成一排。就在他们准备拿起它的时候,一个神奇的圈子就被触发了。他们呆在原地,石头开始移动。

如上所述,石头排成一排。现在,一些石头移动到该线的一端,而其他石头移动到另一端。除非它们与其他石头碰撞,否则它们不会改变运动方向。碰撞意味着两个石头移动到同一位置,然后两个石头的方向都将改变。无论是否发生碰撞,速度始终为1 m / s。石头到达一端时会消失。

他们知道魔术圈会在t秒后消失。这意味着在t秒钟后,他可以移动,石头将恢复静止状态。这也意味着他们会得到那些石头。他想知道到底能得到多少块魔法石,包括他来到森林时得到的第一枚。

输入格式:

第一行包含三个整数n,L,t(0≤n≤106,2≤L≤109,0≤t≤106)-线上的宝石数为n,线的长度为L计,魔术圈将在t秒后消失。
接下来的n行包含对行中魔石的描述。这些行的第i行包含两个以空格分隔的整数x[i]和d[i],对于i≤n,0<x[i]<L,d[i]∈1,2,代表运动的初始位置和方向(1表示从0到L,2表示从L到0。

输出格式:

输出一个数字,指示小H和小W最终将获得的魔石数量。

输入样例:

在这里给出一组输入。例如:

4 10 6
1 1
5 2
6 1
9 2

输出样例:

在这里给出相应的输出。例如:

3

样例解释:

石头是A(1,1),B(5,2),C(6,1),D(9,2)。

1s之后,它们变为A(2,1),B(4,2),C(7,1),D(8,2);

2s之后,它们变为A(3,2),B(3,1),C(7,2),D(8,1);

3s后,它们变为A(2,2),B(4,1),C(6,2),D(9,1);

4s之后,它们变为A(1,2),B(5,2),C(5,1),D到达L并消失;

5s之后,它们变为A达到0并消失,B(4,2),C(6,1),D消失;

6s之后,它们变成A消失,B(3,2),C(7,1),D消失。

小W和小H最终获得第一个B和C。

注:

1,输入保证在一个位置不会有两个魔术石。

2,如果宝石A和宝石B分别位于4和5,并且A的方向是1,B的方向是2。那么下一秒,两块宝石的位置没有变化,但是方向相反 。

——————————————————————————————————————————

正常思路就是计算每一秒的每一个石头的位置,看最终时刻的石头数量究竟有多少。

参考代码1:(可以运行,但是无法完全通过PTA)

#include <iostream>
using namespace std;
int main()
{bool b;long long n, l, t;cin >> n >> l >> t;long long count=n+1;static long long x[1000000];static int d[1000000];for (size_t i = 0; i < n; i++){cin >> x[i] >> d[i];}for (size_t i = 0; i < t; i++){for (size_t j = 0; j < n; j++){if(d[j]==0){cout << j << ":" << x[j] << " " << d[j] << "     ";continue;}if (b){b = false;cout << j << ":" << x[j] << " " << d[j] << "     ";continue;}if (x[j + 1] - 1 == x[j] && d[j + 1] - 1 == d[j]){d[j]++;d[j+1]--;b = true;}else if (x[j + 1] == x[j] && d[j + 1] -1== d[j]){if (d[j] == 1){x[j]--;d[j] = 2;d[j + 1] = 1;}else{x[j]++;d[j] = 1;d[j + 1] = 2;}}else if(d[j]==1){x[j]++;}else if(d[j]==2){x[j]--;}if(x[j]<=0||x[j]>=l){d[j]=0;count--;cout << j << ":" << x[j] << " " << d[j] << "     ";continue;}cout << j << ":" << x[j] << " " << d[j] << "     ";}}cout<<count<<endl;
}

这是我写的代码,肯定不是最好,其中

    cout << j << ":" << x[j] << " " << d[j] << "     ";

单纯是为了验证过程是否正确可以直接删除。

但是问题来了,pta上显示运行超时啊,我就苦思冥想,怎么优化这个代码,但是这两个循环一个都去不掉啊??

我向同学求助之后才恍然大悟。这题用了很多行来误导。稍微精简一点的题目如下,

——————————————————————————————————————————

简化的题目

石头排成一排。每块石头有两个方向,他们不会发生碰撞,速度始终为1 m / s。石头到达一端时会消失。

他们知道魔术圈会在t秒后消失。这意味着在t秒钟后,他可以移动,石头将恢复静止状态。这也意味着他们会得到那些石头。他想知道到底能得到多少块魔法石,包括他来到森林时得到的第一枚。

输入格式:

第一行包含三个整数n,L,t(0≤n≤106,2≤L≤109,0≤t≤106)-线上的宝石数为n,线的长度为L计,魔术圈将在t秒后消失。
接下来的n行包含对行中魔石的描述。这些行的第i行包含两个以空格分隔的整数x[i]和d[i],对于i≤n,0<x[i]<L,d[i]∈1,2,代表运动的初始位置和方向(1表示从0到L,2表示从L到0。

输出格式:

输出一个数字,指示小H和小W最终将获得的魔石数量。

输入样例:

在这里给出一组输入。例如:

4 10 6
1 1
5 2
6 1
9 2

输出样例:

在这里给出相应的输出。例如:

3

样例解释:

石头是A(1,1),B(5,2),C(6,1),D(9,2)。

1s之后,它们变为A(2,1),B(4,2),C(7,1),D(8,2);

2s之后,它们变为A(3,2),B(3,1),C(7,2),D(8,1);

3s后,它们变为A(2,2),B(4,1),C(6,2),D(9,1);

4s之后,它们变为A(1,2),B(5,2),C(5,1),D到达L并消失;

5s之后,它们变为A达到0并消失,B(4,2),C(6,1),D消失;

6s之后,它们变成A消失,B(3,2),C(7,1),D消失。

小W和小H最终获得第一个B和C。

注:

1,输入保证在一个位置不会有两个魔术石。

——————————————————————————————————————————

这么一来就简单多了,原题也就是相当于没有进行碰撞,如果按碰撞的思维去做,这题肯定是拿不了满分的,

参考代码2:(能通过PTA)

#include <iostream>
using namespace std;
int main()
{long long n, l, t,m=0;cin >> n >> l >> t;static long long x[1000000];static int d[1000000];for (size_t i = 0; i < n; i++){cin >> x[i] >> d[i];}for (size_t j = 0; j < n; j++){if(d[j]==1&&l-x[j]<=t){m++;}if(d[j]==2&&x[j]<=t){m++;}}cout<<n-m+1<<endl;
}

说我气吧,我确实气,查了一个下午怎么优化这个代码,但也不完全是无功而返吧。

希望拿来这道题出卷的老师也来试试这题,挺有意思的。

PTA: 小H小W爱魔法相关推荐

  1. 牛客Wannafly挑战赛10 A.小H和迷宫

    链接:https://www.nowcoder.com/acm/contest/72/A 来源:牛客网 题目描述 小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以 ...

  2. H 小P的数学问题(分块)

    H 小P的数学问题(牛客网·江西财经大学第一届程序设计竞赛2018-04-21) 小P的数学问题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 6 ...

  3. 小 H 的数字c++

    题目描述 小 H 有一天突发奇想,写下了一串数字:l(l+1)(l+2)...(r-1)r.例如: l = 2,r = 5 时,数字为:2345; l = 8,r = 12 时,数字为:8910111 ...

  4. Vijos P1986 小h的妹子树二

    Vijos P1986 小h的妹子树二 题目 背景 小h同学的妹子实在是太多辣,多的他又种下了一颗妹子树. 描述 树上有n个妹子,两两之间有且仅有一条路径. 小h每次想泡两个妹子,但是妹子是一种奇怪的 ...

  5. 小H和迷宫(C++)

    题目描述 ​ 小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%.b%.c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使怪兽失去 ...

  6. XMUOJ·小H的超大背包

    小H的超大背包 题目描述 小H有一个容量特别大的背包,用来装一些体积很大的物品. 每个物品都有一个价值,并且只有一件 请你帮助小H计算这个超大背包最大能装多少价值的物品,并且这些物品的总体积不超过背包 ...

  7. 刷题记录:牛客NC15162小H的询问

    传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...

  8. 牛客-小H的询问(线段树)

    原题链接:更好的阅读体验 题目描述 小H给你一个数组{a},要求支持以下两种操作: 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间 ...

  9. 7-10 小H喜欢睡觉

    分数 10 全屏浏览题目 切换布局 作者 彭昊 单位 吉首大学 小H十分喜欢睡觉,这天他起来一看,居然9.30了,而他答应了10点要到小W家去,小H想走知道小H到小W家的最短时间是多少,你能帮帮他吗. ...

最新文章

  1. Prolog学习:数独和八皇后问题
  2. python 执行ping命令_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!...
  3. Xcode 6 Bug:Interface Builder文件中的未知类
  4. android ip探测,Android-IpReachabilityMonitor
  5. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
  6. Windows进程与线程学习笔记(七)—— 时间片管理
  7. linux cut列截取工具使用示例
  8. Oracle X$Tables
  9. 关于eclipse的实用技巧
  10. 数据库原理与应用(SQL Server)笔记 第十章 用户定义函数
  11. uva_1422 Processor
  12. 用WPF实现在ListView中的鼠标悬停Tooltip显示
  13. Ubuntu 使用 Smina 对接教程
  14. django 笔记3
  15. 影视导航资源库api php,影视资源采集站
  16. 如何撰写专利说明书摘要?
  17. 通过HOST VIP连接Oracle数据库
  18. 超详细linux手动配置单网卡和双网卡(bond0和team)以及DNS,linux网络配置详细说明,ps:使用命令配置
  19. 亚马逊云科技 Build On -serverless商店行业应用实践
  20. 关于Youtube榜单数据的探索,排名第一的视频播放次数已接近90亿次!

热门文章

  1. 常用Word页码设置大全
  2. 苹果也是纸老虎,其nano-sim标准真是另人精艳
  3. python发短信sim800_SIM800C通讯模块调试(六)接收短信
  4. python爬取cctalk视频_python爬虫urllib使用和进阶 | Python爬虫实战二
  5. 港大计算机硕士面试多久有通知,港大计算机 HKU CS面试准备
  6. HashMap实现的原理,hashmap怎么存的值?看了就懂了
  7. dwg转成shape格式
  8. 商务礼仪培训,细节决定成败
  9. IT历史:互联网简史
  10. <Zhuuu_ZZ>HIVE(十一)函数