【题解】 NOIP2012pj 寻宝 洛谷P1076
2017-07-07 19:34
495 查看
NOIP2012 第二题 寻宝
NOIP2012 第二题 寻宝考点
题意
思路
代码
考点
模拟减枝
题意
原题链接给定一个长度为m环,寻找第i个值为1的节点,重复n次思路
一看这道题就是模拟了(一条规律到底),但是有许多坑点的确让人很难受,m的值很大,还要打个优化,幸好优化不算难打。使用优化后want会等于0,但是不是立刻上楼而是上顺时针第一个。但是在NOIP赛场中没有打上去的话只有70分的点,加上三行优化就30分了。一幅图了解坑点(我居然还画了图…)
代码
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxfloor=10001; const int maxroom=101; int n,m; int startroom; struct room_info { bool up; int sign; }; room_info rooms[maxfloor][maxroom]; int floorstair[maxfloor];//这是优化,每一层有几个楼梯 int floor(int floornum,int s)//floor()模拟层数 floornum当前层 s开始房间 { if(floornum==n+1) return 0;//询问密钥 int cnt=0;//计算一共有多少个有楼梯的房间 int nowroom=s; int want=rooms[floornum][s].sign; want=want%(floorstair[floornum]); if(want==0)//特判want==0,节省时间 { want=floorstair[floornum];//数学环形植树,一大坑题(第一次WA在这里了) } while(true) { if(rooms[floornum][nowroom].up==1)//有楼梯的房间 ++cnt; if(cnt==want)//这是第m个有楼梯的房间 { return (floor(floornum+1,nowroom)+rooms[floornum][s].sign)%20123;//返回密钥 } ++nowroom;//下一个房间 if(nowroom==m) nowroom=0;//从零开始,一大坑题 } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { for(int j=0;j<m;++j) { scanf("%d%d",&rooms[i][j].up,&rooms[i][j].sign); floorstair[i]+=rooms[i][j].up; } } scanf("%d",&startroom); printf("%d\n",floor(1,startroom)); return 0; }
相关文章推荐
- 【题解】洛谷 P1179数字统计 NOIPpj 数字统计
- NOIP 2012 Day2T2 借教室题解
- [NOIP2012] 提高组 洛谷P1084 疫情控制
- NOIP2012提高组 开车旅行 题解+代码
- 洛谷 [NOIP2012 D1T2] P1080 国王游戏
- [NOIP2012] 提高组 洛谷P1081 开车旅行
- NOIP 2012 普及组 第二题 寻宝
- noip2012 寻宝 (模拟)
- BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
- 洛谷 P1082 [NOIP2012 D2T1] 同余方程
- 【codevs1316&&NOIP2012PJ】文化之旅,无题
- NOIP2015PJ T3,T4题解
- 洛谷 1083||NOIP 2012 借教室 二分答案+差分 解题报告
- B. 【NOIP2012普及组真题】 寻宝
- NOIP2010第三题 ---接水问题(摘自洛谷题解)
- 洛谷 P1079 [NOIP2012 D1T1] Vigenère 密码
- 【模拟】【noip2012普及组】寻宝
- NOIP2012提高组day1 vigenere密码 题解
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
- 扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)