信息与未来2025 T6 题解
话说信息与未来的题目是真有意思。
难以置信的是我居然在考场上搞定了这道题。
思路
这道题呢我使用的方法是一层一层加,也就是说从满足\(p_{i+1}\).cpp要求的推导到满足\(p_i\).cpp要求的。
推导方式
每一次从推导\(p_{i+1}\).cpp推导到\(p_i\).cpp方法就是:
1、先把在\(p_{i+1}\).cpp中的每一个\变成\\
因为c、c++输出时为了区分,如果想要输出"和\时需要输出\"和\\
2、在修改后的\(p_{i+1}\).cpp的每一行套上cout << \"和
\" << endl;"
这里之所以使用\"而非"是因为我们输出\(p_{i-1}\).cpp的时候会吃掉那个\,这样就可以在运行到\(p_i\)的时候只剩"了。
3、在进一步修改后的\(p_{i+1}\).cpp 的前面加上
#include <iostream>
using namespace std;
int main() {
后面加上
return 0;
}
这样就完成了\(p_i\).cpp
注意点
还要注意的是:
1、最开始时我建议不要在数字两边输出"。 虽然我不知道能不能。
2、如果用的是我的方法的话,最后一次推导到\(p_1\).cpp的时候不需要把每一个\\变成\\\\,也不需要把\"变成\\\",更不要在最后一次的时候cout后面还用\",直接用"就好了。
3、在将\"变成字符串拼接到代码上去时,需要写成"\\\"" 。
4、存放代码时不可在二维数组的开头几行存,因为我们推导时需要在每次在顶上加上3行。
代码
考场AC代码:(注释是后加的)(freopen似乎删掉了)
#include <bits/stdc++.h>
using namespace std;
map<int, string> s; // 用于存放当前.cpp程序,这边我使用的是map,数组应该也可以。
string nts(int k) // 数字转字符串,这样可以使用STL string直接拼接。
{
string s;
while (k)
{
s = (char)(k % 10 + '0') + s;
k /= 10;
}
return s;
}
pair<int, int> kkk(int mn, int mx, int i) // 推导,方法看上面。mn的意思是当前程序第一行在s中的行下标,mx的意思是最后一行程序在s中的行下标。i好像没有用(比赛时脑子抽了)
{
for (map<int, string>::iterator it = s.begin(); it != s.end(); it++)
{
string t; 用于存放第一步过后该行代码。
for (int i = 0; i < s[it->first].size(); i++)
{
// 将\\改成\\\\,\"改成\\\"。
if (s[it->first][i] == '\\')
{
t += "\\\\";
}
else if (s[it->first][i] == '\"')
{
t += "\\\"";
}
else
{
t += s[it->first][i];
}
}
s[it->first] = "cout << \\\"" + t + "\\\" << endl;"; // 第二步,前后加上cout << \" 和 \" << endl;" 注意一下注意点3
}
// 第3部,前后加上头文件,主函数,大括号,return 0 等。
s[mn - 3] = "#include <iostream>";
s[mn - 2] = "using namespace std;";
s[mn - 1] = "int main() {";
s[mx + 1] = "return 0;";
s[mx + 2] = "}";
return { mn - 3, mx + 2 };
}
int main()
{
int n, k;
cin >> n >> k;
if (n == 1)
{
cout << k << endl;
return 0;
}
// 注意一下注意点4
// 数字有点臭,不喜勿喷
s[11451] = "#include <iostream>";
s[11452] = "using namespace std;";
s[11453] = "int main() { ";
s[11454] = "cout << " + nts(k) + " << endl;"; // 注意一下注意点1
s[11455] = "return 0;";
s[11456] = "}";
if (n == 2)
{
for (map<int, string>::iterator it = s.begin(); it != s.end(); it++)
{
cout << s[it->first] << endl;
}
return 0;
}
int mn = 11451;
int mx = 11456;
for (int i = 2; i < n - 1; i++)
{
// 推导
pair<int, int> pii = kkk(mn, mx, i - 2);
// 更新mn 和 mx
mn = pii.first;
mx = pii.second;
}
for (map<int, string>::iterator it = s.begin(); it != s.end(); it++)
{
s[it->first] = "cout << \"" + s[it->first] + "\" << endl;"; // 注意一下注意点4
}
s[mn - 3] = "#include <iostream>";
s[mn - 2] = "using namespace std;";
s[mn - 1] = "int main() {";
s[mx + 1] = "return 0;";
s[mx + 2] = "}";
// 输出,也可以输出mn到mx,但是如果输出mn到mx的话最后别忘了在更新一下哦
for (map<int, string>::iterator it = s.begin(); it != s.end(); it++)
{
cout << s[it->first] << endl;
}
return 0;
}
结语
非常感谢各位大佬能够看完该蒟蒻的题解!v
最后,写题解不易,给个赞吧!谢谢!

浙公网安备 33010602011771号