A题 https://nanti.jisuanke.com/t/15503
思路:模拟打麻将,抓拍顺抓倒着数丢色子
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <algorithm>
using namespace std;
const int max_n = 100005;
int num1,num2,num3,num4;
int k,d;
vector<pair<int,int> >v;
bool judge(int x,int y) {
int sum = num1+num2+num3+num4;
int t = min(x,y)+1;
int g = x+y;
g %= 4;
int j = 0;
if(g == 0) {
j = num1;
} else if(g == 3) {
j = num1+num4;
} else if(g == 2) {
j = num1+num4+num3;
}
j = (j+t-1)%sum;
int fg = 0;
int flag = 0;
int wan = 1;
int cnt = 0;
for(int kk = j; kk < sum && cnt < 24; kk++) {
fg++;
cnt++;
if(wan == 1 && (v[kk].first == k &&(v[kk].second == d||v[kk].second == d+1))) {
flag++;
}
if(fg%2 == 0) {
wan++;
wan %= 4;
}
}
for(int kk = 0; kk < j && cnt < 24; ++kk) {
fg++;
cnt++;
if(wan == 1 && (v[kk].first == k &&(v[kk].second == d||v[kk].second == d+1))) {
flag++;
}
if(fg%2 == 0) {
wan++;
wan %= 4;
}
}
if(flag == 2) {
return true;
}
return false;
}
int main() {
cin >> num1 >> num2 >> num3 >> num4;
cin >> k >> d;
k %= 4;
for(int i = 1; i <= num1; i++) {
v.push_back(pair<int,int>(1,i));
}
for(int i = 1; i <= num4; i++) {
v.push_back(pair<int,int>(0,i));
}
for(int i = 1; i <= num3; i++) {
v.push_back(pair<int,int>(3,i));
}
for(int i = 1; i <= num2; i++) {
v.push_back(pair<int,int>(2,i));
}
int ans = 0;
bool used[10][10];
memset(used,0,sizeof(used));
for(int i = 1; i < 7; i++) {
for(int j = 1; j < 7; j++) {
if(judge(i,j) && !used[i][j]) {
//cout << i << " " << j <<endl;
used[i][j] = 1;
used[j][i] = 1;
ans++;
}
}
}
cout << ans<<endl;
return 0;
}
我自己写的真的很烦
B题 https://nanti.jisuanke.com/t/15504
简单版本表达式求值,利用栈模拟,打一份以前写过的表达式求值就可以了,表达式求值写起来很麻烦,所以用Python
n = input()
a = input()
b = eval(a)
if type(b) == int:
print(b)
else:
print("%.6f"%b)
C++代码,由于自己写的栈的模拟错了,所以引用了这位巨巨的博客代码 http://blog.youkuaiyun.com/flyfy1/article/details/5309551 然后修改了一下就可以了
#include <iostream>
#include <string>
#include <stack>
#include <fstream>
using namespace std;
bool isone(char c) {
return (c=='+' || c=='-');
}
bool istwo(char c) {
return (c=='*' || c=='/');
}
string shorten(string m) {
stack<char> s;
string sur;
int i;
char w;
for(i=0; i<m.size(); i++) {
if(isdigit(m[i]) || m[i]=='.') {
while(isdigit(m[i]) || m[i]=='.') sur += m[i++];
i--;
sur += '$';
} else if(isone(m[i])) {
while(s.size() && (isone(s.top()) || istwo(s.top()))) {
sur+=s.top();
s.pop();
}
s.push(m[i]);
} else if(m[i]==')') {
while(s.top()!='(') {
sur+=s.top();
s.pop();
}
s.pop();
} else if(istwo(m[i])) {
while(s.size() && istwo(s.top())) {
sur+=s.top();
s.pop();
}
s.push(m[i]);
} else s.push(m[i]);
}
while(s.size()) {
sur+=s.top();
s.pop();
}
return sur;
}
double tentimes(int n) {
double res=1;
for(int i=0; i<n; i++) {
res *= 10;
}
return res;
}
double str2double(string s) {
double res=0;
char c;
int dec=0;
for(int i=1; i<=s.size(); i++) {
c=s[i-1];
if(c=='.') dec=i;
else if(!dec) res = res*10 + c-'0';
else res += (c-'0')/tentimes(i-dec);
}
return res;
}
double calculate(string s) {
double res, t;
stack<double> num;
string temp;
int i;
for(i=0; i<s.size(); i++) {
temp="";
if(isdigit(s[i]) || s[i]=='.') {
while(isdigit(s[i]) || s[i]=='.') temp+=s[i++]; //如果最后一位是数字,这样做会出错
num.push(str2double(temp));
} else {
switch (s[i]) {
case '+':
t=num.top();
num.pop();
t+=num.top();
num.pop();
num.push(t);
break;
case '-':
t=num.top();
num.pop();
t=num.top()-t;
num.pop();
num.push(t);
break;
case '*':
t=num.top();
num.pop();
t*=num.top();
num.pop();
num.push(t);
break;
case '/':
t=num.top();
num.pop();
t=num.top()/t;
num.pop();
num.push(t);
break;
}
}
}
res=num.top();
return res;
}
int main() {
int n;
cin >> n;
string s;
for(int i = 0;i < n++;i){
cin >> s;
}
string mid, sur;
cin >> mid;
int flag = 0;
for(int i = 0; i < mid.length(); ++i) {
if(mid[i] == '.' || mid[i] == '/') {
flag = 1;
}
}
sur = shorten(mid);
if(flag) {
printf("%.6f\n",calculate(sur));
} else
printf("%.0f\n",calculate(sur));
return 0;
}