这周末就要天梯赛了,这不得赶紧刷题,这L2的40道题要保证一下质量。
这道题——哲哲打游戏,确实乍一看很难入手,题目很长,数据庞杂,但仔细阅读起来会发现,这道题并没有想象中的复杂,像是给你一个下马威。
大致题意是这样的:给你了在每个关卡可以去的若干个关卡通道,每次操作可以选择去哪一个通道,也可以选择存档和读档,最后输出存档时到达的地方和最后到达的地方。
一个二维数组的空间开最大:a[22222][22222],在dev c++5.11中,再大就炸了。
从题意入手,输入,操作,保存,输出,流畅写出来代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[22222][22222];
int dang[110];
int main()
{
int n, m;
cin >> n >> m;
for(int i=1;i<=n;i++)
{
int k;
cin >> k;
for(int j=1;j<=k;j++)
{
int x;
cin >> x;
a[i][j] = x;
}
}
int p=1;
for(int i=0;i<m;i++)
{
int k;
cin >> k;
if(k==0)
{
int kk;
cin >> kk;
p = a[p][kk];
}
else if(k==1)
{
int kk;
cin >> kk;
dang[kk] = p;
cout << p << "\n";
}
else if(k==2)
{
int kk;
cin >> kk;
p = dang[kk];
}
}
cout << p;
return 0;
}
有两个数据没有过,一个段错误一个内存超限,估计是二维数组的事。
一开始就注意到这个问题了,题目上的1<N,没有明确给出大小,卡你一个两个数据也是在情理之中。
这就得把二维数组给优化一下。
使用vector存a数组:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//int a[22222][22222];
vector<int> a[100010];
int dang[110];
int main()
{
int n, m;
cin >> n >> m;
for(int i=1;i<=n;i++)
{
int k;
cin >> k;
for(int j=1;j<=k;j++)
{
int x;
cin >> x;
//a[i][j] = x;
a[i].push_back(x);
}
}
int p=1;
for(int i=0;i<m;i++)
{
int k;
cin >> k;
if(k==0)
{
int kk;
cin >> kk;
p = a[p][kk-1];
}
else if(k==1)
{
int kk;
cin >> kk;
dang[kk-1] = p;
cout << p << "\n";
}
else if(k==2)
{
int kk;
cin >> kk;
p = dang[kk-1];
}
}
cout << p;
return 0;
}
满分ok!