洛谷【LGR-061】洛谷10月月赛 II & X Round 4 Div.2 【XR-4】歌唱比赛

题目链接:

https://www.luogu.org/problem/P5595?contestId=21737

 

开始是先抢了分,然后将所有部分补齐。

题目描述:

小 X 参加了一场歌唱比赛。

经过一路鏖战,小 X 终于挺进了决赛,他的对手是小 Y。

这场歌唱比赛的冠军是由点赞数决定的,谁的点赞数高,谁就能夺冠。

小 X 和小 Y 依次演唱完自己的最后一首歌曲后,他们最终的点赞数确定了下来。

揭晓冠军的时刻终于到来了,主持人为了增加悬念,决定从小 X 与小 Y 的点赞数的最后一位开始,依次比较。

比如,小 X 的点赞数是 37,小 Y 的点赞数是28。首先比较最后一位,小 X 是 7,小 Y 是 8,此时小 Y 暂时领先。再加上前一位,小 X 是 37,小 Y 是 28,此时小 X 暂时领先。比较结束,如果我们用 X 代表小 X 暂时领先,Y 代表小 Y 暂时领先,那么可以写下一个字符串 XY。

再比如,小 X 的点赞数是 137,小 Y 的点赞数是 47。如果我们再用 Z 表示小 X 与小 Y 的点赞数暂时一样,那么写下的字符串应该为 XYZ。

你作为一个精通 OI 的神仙,自然知道这种比较方式是非常不科学的,这样只是在无端拖延时间罢了,但是你却对最后写下的这个字符串很感兴趣。

现在,你得到了这个最后写下的字符串,你需要构造出一种可能的小 X 与小 Y 的点赞数。

当然,有可能不存在任何一种情况的点赞数满足这个字符串,那么你只需要输出 -1 即可。

为了方便你输出,请用前导零来补足位数。

题意:

给你一串字符串,从后往前,如果当前位数是X则表示到目前为止已经公布的数据X暂时领先,若是Y 同理,若是Z则表示两人暂时持平。

请你输出一个可行解。

思路:开始我还在纳闷,为啥XY就是输出X:37,Y:28。后来想了一下,随意是啥都可以,这种情况可以是X:26,Y:17,只要满足XY的条件就可以。

判断s.length() == 1的情况:

  只能是X或者是Y,随意输出合理情况就行。

判断无解:

  从前向遍历,记录出现的第一个Z的index即index_Z,若在index_Z之后还会出现X或Y,则可判定当前情况X和Y一定不等,中、可输出“-1”。

最后的情况就是最普通的,遍历判断即可。

此处注意:

  在输出过程中,输出的长度要和s.length()相同,不足的用0补齐,因为是任意可行解都可以,循环输出,在少的位数注意输出0即可。(若自己代码内部定义的输出值可以使X、Y的赞数相同则不需要少的位数的先输出0,直接输出就行)。

下面是AC代码

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 using namespace std;
 6 string s;
 7 vector<int> X, Y;
 8 int main(int argc, const char * argv[]) {
 9     cin >> s;
10     int len = s.length();
11     
12     if (len == 1) {
13         if (s[0] == 'X') {
14             X.push_back(8);
15             Y.push_back(7);
16             cout << X[0] << endl << Y[0];
17             return 0;
18         } else if (s[0] == 'Y') {
19             X.push_back(7);
20             Y.push_back(8);
21             cout << X[0] << endl << Y[0];
22             return 0;
23         } else {
24             X.push_back(8);
25             Y.push_back(8);
26             cout << X[0] << endl << Y[0];
27             return 0;
28         }
29     }
30     
31     //无解
32     int index_Z = -1;
33     for (int i = 0; i < len; i++) {
34         if (s[i] == 'Z') {
35             index_Z = i;
36             break;
37         }
38     }
39     if (index_Z >= 0) {
40         for (int i = index_Z + 1; i < len; i++) {
41             if (s[i] != 'Z') {
42                 cout << "-1";
43                 return 0;
44             }
45         }
46     }
47     
48     //有解
49     for (int i = len - 1; i >= 0; i--) {
50         if (s[i] == 'X') {
51             X.push_back(8);
52             Y.push_back(7);
53         } else if (s[i] == 'Y') {
54             X.push_back(7);
55             Y.push_back(8);
56         } else { //s[i] == 'Z'
57             X.push_back(0);
58             Y.push_back(0);
59         }
60     }
61     if (X.size() > Y.size()) {
62         for (int i = X.size() - 1; i >= 0; i--) {
63             cout << X[i];
64         }
65         cout << endl << "0";
66         for (int i = Y.size() - 1; i >= 0; i--) {
67             cout << Y[i];
68         }
69     } else if (X.size() < Y.size()) {
70         cout << "0";
71         for (int i = X.size() - 1; i >= 0; i--) {
72             cout << X[i];
73         }
74         cout << endl;
75         for (int i = Y.size() - 1; i >= 0; i--) {
76             cout << Y[i];
77         }
78     } else {
79         for (int i = X.size() - 1; i >= 0; i--) {
80             cout << X[i];
81         }
82         cout << endl;
83         for (int i = Y.size() - 1; i >= 0; i--) {
84             cout << Y[i];
85         }
86     }
87     return 0;
88 }

蒟蒻表示欢迎大佬们指正!

你可能感兴趣的:(洛谷【LGR-061】洛谷10月月赛 II & X Round 4 Div.2 【XR-4】歌唱比赛)