做外贸站推广,赣州网站建设有哪些,上海做什么工作最赚钱,河南省新闻发布会直播题目 试题描述传说很遥远的藏宝楼顶层藏着诱人的宝藏。 小明历尽千辛万苦终于找到传说中的这个藏宝楼#xff0c;藏宝楼的门口竖着一个木板#xff0c;上面写有几个大字#xff1a;寻宝说明书。说明书的内容如下#xff1a;藏宝楼共有N1层#xff0c;最上面一层是顶层藏宝楼的门口竖着一个木板上面写有几个大字寻宝说明书。 说明书的内容如下藏宝楼共有N1层最上面一层是顶层顶层有一个房间里面藏着宝藏。除了顶层外藏宝楼另有 N层每层M个房间这M个房间围成一圈并按逆时针方向依次编号为0…M-1。其中一些房间有通往上一层的楼梯每层楼的楼梯设计可能不同。每个房间里有一个指示牌指示牌上有一个数字x表示从这个房间开始按逆时针方向选择第x个有楼梯的房间假定该房间的编号为k从该房间上楼上楼后到达上一层的k号房间。比如当前房间的指示牌上写着2则按逆时针方向开始尝试找到第2个有楼梯的房间从该房间上楼。如果当前房间本身就有楼梯通向上层该房间作为第一个有楼梯的房间。寻宝说明书的最后用红色大号字体写着“寻宝须知帮助你找到每层上楼房间的指示牌上的数字即每层第一个进入的房间内指示牌上的数字总和为打开宝箱的密钥”。请帮助小明算出这个打开宝箱的密钥。 输入 第一行2个整数N和M之间用一个空格隔开。N表示除了顶层外藏宝楼共N层楼M表示除顶层外每层楼有M个房间。接下来N*M行每行两个整数之间用一个空格隔开每行描述一个房间内的情况其中第(i-1)*Mj 行表示第i层j-1号房间的情况i1,2,…,Nj1,2,…,M。第一个整数表示该房间是否有楼梯通往上一层0表示没有1表示有第二个整数表示指示牌上的数字。注意从j号房间的楼梯爬到上一层到达的房间一定也是j号房间。最后一行一个整数表示小明从藏宝楼底层的几号房间进入开始寻宝注房间编号从0开始。 输出 输出只有一行一个整数表示打开宝箱的密钥这个数可能会很大请输出对20123取模的结果即可。 输入示例 2 31 20 31 40 11 51 21 输出示例 5 其他说明 【输入输出样例说明】 第一层 0 号房间有楼梯通往上层指示牌上的数字是 2 1 号房间无楼梯通往上层指示牌上的数字是 3 2 号房间有楼梯通往上层指示牌上的数字是 4 第二层 0 号房间无楼梯通往上层指示牌上的数字是 1 1 号房间有楼梯通往上层指示牌上的数字是 5 2 号房间有楼梯通往上层指示牌上的数字是 2小明首先进入第一层底层的 1 号房间记下指示牌上的数字为3然后从这个房间开始 沿逆时针方向选择第3个有楼梯的房间2号房间进入上楼后到达第二层的2号房间记下指示牌上的数字为2 由于当前房间本身有楼梯通向上层该房间作为第一个有楼梯的房间。因此此时沿逆时针方向选择第2个有楼梯的房间即为1号房间进入后上楼梯到达顶层。这时把上述记下的指示牌上的数字加起来即325所以打开宝箱的密钥就是5。【数据范围】0N≤100000M≤1000x≤1,000,000。 分析 这道题是一个裸的模拟但有许多细节需要注意。我们定义f[x][y]表示第x层第y个房间是否有楼梯num[x][y]表示第x层第y个房间指示牌上的数字。sum[i]表示第i层有几个有楼梯的房间。然后逐层模拟找有楼梯的房间。这部很关键代码如下。 if(f[floar][room]) room_num--; //room_num表示还需要找几个有楼梯的房间。
room_num((room_num-1)%sum[floar])1; //括号里减1最后加1保证值不为0因为(room_num-1)%sum[floar]≥0且10。最后化简得若(room_num-1)%sum[floar]0整体为1。反之为1。
while(room_num0)
{room;if(roomm) room0; //若搜到最高房间号从0开始。实现一个循还。if(f[floar][room]) room_num--; //若f[floar][room]为1说明这个有楼梯。则还需要找的有楼梯的房间数--。 } 再定义ans把每层第一个有楼梯的房间指示牌上的数字累加。值得注意的是房间号是从0到m-1。完整代码如下。 #include bits/stdc.h
using namespace roomd;
#define MOD 20123
int n,m,num[10005][105],sum[10005],ans,room,floar1;
bool f[10005][105];
int main() {scanf(%d %d,n,m);for(int i1; in; i) {for(int j1; jm; j) {int x,y;scanf(%d %d,x,y);if(x) {f[i][j]true;sum[i];}num[i][j]y;}}scanf(%d,room);room;while(floarn) {int room_numnum[floar][room];ans(ansroom_num)%MOD;if(f[floar][room]) room_num--;room_num((room_num-1)%sum[floar])1; //括号里减1最后加1保证值不为0因为(room_num-1)%sum[floar]≥0且10。最后化简得若(room_num-1)%sum[floar]0整体为1。反之为1。while(room_num0) {room;if(roomm) room0;if(f[floar][room]) room_num--;}floar;}printf(%d,ans);return 0;
}转载于:https://www.cnblogs.com/zxjhaha/p/11288386.html