试题编号: | 201903-2 |
试题名称: | 二十四点 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | |
不知道为啥,结果就是50分,验证是对乘除处理不对,但是我自己设计的测试用例都能通过,就很烦。
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include <iostream>
#include<iomanip>
using namespace std;
struct cal {
int pos, priority; //位置、优先级
char value;
bool operator <(const cal& s)const
{
if (priority == s.priority)
{
return pos > s.pos; //从左往右
}
else
return priority > s.priority; //最小堆,优先级0为高
}
};
int Cal(string s)
{
cal CC;
priority_queue<cal> Room;
int position;
bool Flag[4] = { 0 };
int number[4];
for (int i = 0; i < 3; i++)
{
position = s.find('x'); //除2将位置转化为0 1 2
if (position != -1)
{
CC.pos = position / 2;
CC.priority = 0;
CC.value = 'x';
}
else
{
position = s.find('/');
if (position != -1)
{
CC.pos = position / 2;
CC.priority = 0;
CC.value = '/';
}
else
{
position = s.find('+');
if (position != -1)
{
CC.pos = position / 2;
CC.priority = 1;
CC.value = '+';
}
else
{
position = s.find('-');
if (position != -1)
{
CC.pos = position / 2;
CC.priority = 1;
CC.value = '-';
}
}
}
}
//cout << "pos=" << CC.pos << " pri=" << CC.priority << " val =" << CC.value << endl;
Room.push(CC);
s[CC.pos * 2 + 1] = 'k';
}
for (int i = 0; i < 4; i++)
{
number[i] = s[i * 2] - '0';
//cout << number[i];
}
int mid[3], result;
for (int i = 0; i < 3; i++)
{
int a, b, c = -1;
cal save = Room.top();
if (Flag[save.pos])
{
a = mid[save.pos - 1];
c = save.pos - 1;
}
else
{
a = number[save.pos];
Flag[save.pos] = 1;
}
if (Flag[save.pos + 1])
{
b = mid[save.pos + 1];
c = save.pos - 1;
}
else
{
b = number[save.pos + 1];
Flag[save.pos + 1] = 1;
}
switch (save.value)
{
case 'x':
mid[save.pos] = a * b;
//cout << a << '*' << b << endl;
break;
case '/':
mid[save.pos] = a / b;
//cout << a << '/' << b << endl;
break;
case '+':
mid[save.pos] = a + b;
//cout << a << '+' << b << endl;
break;
case '-':
mid[save.pos] = a - b;
//cout << a << '-' << b << endl;
break;
}
if (c != -1)
mid[c] = mid[save.pos];
result = mid[save.pos];
//cout << "res =" << result << endl;
Room.pop();
}
return result;
}
int main()
{
int i, j, N, M;
cin >> N;
for (int i = 0; i < N; i++)
{
string S;
cin >> S;
M = Cal(S);
//cout << "res" << M << endl;
if (M == 24)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}