周五刷了一个小时结果只刷了一题多一点,时间也有点晚了,blog就没更新。然后周六继续周五没完成的,看了一下逻辑有点混乱没继续。
题目 B1018
-
题意
拼音首字母代表石头剪刀布,然后输赢规则大家都懂。根据输入计算各自的输赢平局次数,最后输出各自赢得概率最高的字母。 -
思路
- 这里我很暴力地去判断输赢,最后最高概率字母因为按字母序来,所以从最小的开始判断。
- 这里其实题目给了一些线索,最小序,会很自然的把BCJ按顺序排起来,然后又会很自然的发现B赢C, C赢J,J赢B。这里判断输赢的方式就会转换为
a[(i+1)%3] == b[i]
a 赢b;b[(i+1)%3] == a[i]
b赢a。a[i]==b[i]
a和b平局。
- Code in C++
#include <iostream>
#include <map>
int compare(char a, char b) {
if (a == 'C') {
switch(b) {
case 'C':
return 0;
case 'B':
return -1;
case 'J':
return 1;
}
} else if (a == 'B') {
switch(b) {
case 'B':
return 0;
case 'C':
return 1;
case 'J':
return -1;
}
} else {
switch(b) {
case 'J':
return 0;
case 'B':
return 1;
case 'C':
return -1;
}
}
}
int maxt(int a, int b, int c) {
if (a > b) {
if (a > c) {
return a;
} else {
return c;
}
} else {
if (b > c) {
return b;
} else {
return c;
}
}
}
int main()
{
int N;
std::cin >> N;
int awin = 0, aequ = 0, afail = 0;
std::map<char,int> a = {{'C',0},{'J',0},{'B',0}};
std::map<char,int> b = {{'C',0},{'J',0},{'B',0}};
while (N--) {
char j, y;
std::cin >> j >> y;
switch(compare(j,y)) {
case 0:
++aequ;
break;
case 1:
++awin;
++a[j];
break;
case -1:
++afail;
++b[y];
break;
}
}
std::cout << awin << " " << aequ << " " << afail << std::endl;
std::cout << afail << " " << aequ << " " << awin << std::endl;
int maxj = maxt(a['C'],a['B'],a['J']);
int maxy = maxt(b['C'],b['B'],b['J']);
if (a['B'] == maxj) {
std::cout << "B ";
} else if (a['C'] == maxj) {
std::cout << "C ";
} else {
std::cout << "J ";
}
if (b['B'] == maxy) {
std::cout << 'B' << std::endl;
} else if (b['C'] == maxy) {
std::cout << 'C' << std::endl;
} else {
std::cout << 'J' << std::endl;
}
}
题目 A1042
-
题意
按给定顺序和次数,洗牌。给出洗完之后的序列。 -
思路
这里我开始做的时候,一直把给定的顺序当作了第一次的初始序列,导致一些思维上的错误。这里很简单暴力的方式就是设置除给定序列外的,start
和end
数组,表示洗牌前后洗牌后的序列,不断重复即可。 -
Code in C++
#include <iostream>
#include <string>
#include <map>
std::map<int, std::string> cards;
int main()
{
char type[4] = {'S','H','C','D'};
for (int i = 0; i < 4; ++i) {
for (int j = 1; j <= 13; ++j) {
cards[i*13+j] = type[i]+std::to_string(j);
}
}
cards[53] = "J1";
cards[54] = "J2";
int n;
std::cin >> n;
int num[54];
for (int i = 0; i < 54; ++i) {
std::cin >> num[i];
}
int start[54] = {0};
int end[54] = {0};
for (int i = 1; i <= 54; ++i) {
start[i-1] = i;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 54; ++j) {
end[num[j]-1] = start[j];
}
for(int k = 0; k < 54; ++k) {
start[k] = end[k];
}
}
std::cout << cards[start[0]];
for (int i = 1; i < 54; ++i) {
std::cout << " " << cards[start[i]];
}
std::cout << std::endl;
return 0;
}
小结
- 绕一点自己的逻辑就稍微有点跟不上,对于A1042一直在思索换的过程中下标和所表示数字的问题,并且开始少设置了一个数组,导致一直有点问题。
- 这两题主要都是数组映射的问题。