洛谷【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 <iostream> 2 #include <cstring> 3 #include <vector> 4 #include <cstdio> 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 }
蒟蒻表示欢迎大佬们指正!