文章目录

题解 LGP8964 梦幻 | Reopening of Dream

由 hycqwq 发布

思路

题目已经说的很清楚了,这里我再补充一点。

如果一位选手同时可能拥有多种身份,那么三种身份的优先级从大到小为:见祖宗人,乐子人,普通人。

所以我将三种身份在程序中处理的编号分别设为:

身份编号
普通人$0$
见祖宗人$2$
乐子人$1$

由于见祖宗人的判断是基于子串的,所以我们要先确保字符串长度大于 $10$(即 //freopen( 的长度)

另外,见祖宗人注释的 freopen 语句不一定要是正确的。如果你搞错了这一点,那么你只能得到 $30$ 分。

代码

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define elif else if

int t, n, m;
string title[5], fin, fout;

int main()
{
    cin >> t >> n >> m;
    for (int i = 1; i <= m; i++)
        cin >> title[i];
    for (int i = 1; i <= n; i++)
    {
        int type = 0;//0普通人 1乐子人 2见祖宗人
        //这样编号,后面在确定身份时就可以直接取max,不用考虑优先级
        for (int j = 1; j <= m; j++)
        {
            cin >> fin >> fout;
            if (fin == "freopen(\"" + title[j] + ".in\",\"r\",stdin);" && fout == "freopen(\"" + title[j] + ".out\",\"w\",stdout);")//普通人
                type = max(0, type);
            elif ((fin.size() >= 10 && fin.substr(0, 10) == "//freopen(" && fin.substr(fin.size() - 2) == ");") || (fout.size() >= 10 && fout.substr(0, 10) == "//freopen(" && fout.substr(fout.size() - 2) == ");"))//见祖宗人
                type = max(2, type);
            else//乐子人
                type = max(1, type);
        }
        if (type == 0)//普通人
            cout << "PION2202 RP++." << endl;
        elif (type == 2)//见祖宗人
            cout << "Wrong file operation takes you to your ancestors along with your 3 years' efforts on OI." << endl;
        else//乐子人
            cout << "Good luck and have fun." << endl;
    }
    return 0;
}

暂无评论

发表评论