题解:P16440 [XJTUPC 2026] 公式战士
显然取 min 或者 max 更优。
关于赛时的题面错误,主要是整个出题组,以及十来个验题队都没看出来。我也觉得很神秘。
多测的原因是,我发现我不能造出单测高质量的数据。这个保证任意操作后
简单给两个我认为不错的实现。
std 实现如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
ll get(string e,ll x) {
if (e=="x") return x;
else return stoll(e);
}
ll calc(string e1,string op,string e2,ll x) {
ll a=get(e1,x),b=get(e2,x);
if (op=="+") return a+b;
else if (op=="-") return a-b;
else if (op=="*") return a*b;
else return a/b;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int T; cin>>T;
while (T--) {
ll n,x; cin>>n>>x;
ll mn=x,mx=x;
for (int i=1;i<=n;i++) {
string e1,op1,e2,e3,op2,e4;
cin>>e1>>op1>>e2>>e3>>op2>>e4;
ll v1=calc(e1,op1,e2,mn);
ll v2=calc(e1,op1,e2,mx);
ll v3=calc(e3,op2,e4,mn);
ll v4=calc(e3,op2,e4,mx);
mn=min({v1,v2,v3,v4});
mx=max({v1,v2,v3,v4});
}
cout<<mx<<'\n';
}
}
一份使用 python eval 的实现,使用了 ShwStone 的代码。
特地为这种时限,将数据范围压缩了一下。
for _ in range(int(input())):
n, x_val = map(int, input().split())
mi = ma = x_val
for _ in range(n):
s = [s.replace('/', '//') for s in input().split()]
e1, e2 = "".join(s[:3]), "".join(s[3:])
res = [eval(e, {'x': v}) for e in (e1, e2) for v in (mi, ma)]
mi, ma = min(res), max(res)
print(ma)
当然不可能所有选手都写出这么优雅的实现。