1. 程式人生 > >HDU 5938 Four Operations(亂搞)題解

HDU 5938 Four Operations(亂搞)題解

題意:把'+', '-', '*' 和'/'按順序插入任意兩數字間隔,使得操作得到後計算後最大。

思路:沒想到是個水題,打的時候想得太複雜了。這道題其實只要考慮*和/。顯然我們要把a*b/c弄到最小。那麼ab只有一位,c可能有兩位。m+n-a*b/c最大,那麼mn和最大,那麼就是-號前面分割最大和。那麼就是max(第一位+後面,前面+最後一位)。

程式碼:

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include
<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> typedef long long ll; const int maxn = 100000 + 10; const int seed = 131; const ll MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; char a[35]; int num1, num2; ll pre1, pre2; bool
check(int len){ num1 = (a[len - 2] - '0') * (a[len - 1] - '0') / (a[len] - '0'); num2 = (a[len - 3] - '0') * (a[len - 2] - '0') / ((a[len - 1] - '0') * 10 + (a[len] - '0')); if(len == 5) return false; if(num1 > num2) return true; else return false; } ll big(int len){ ll num = 0, Max;
for(int i = 1; i <= len - 1; i++){ num = num * 10 + (a[i] - '0'); } Max = num + (a[len] - '0'); num = 0; for(int i = 2; i <= len; i++){ num = num * 10 + (a[i] - '0'); } num += (a[1] - '0'); Max = max(Max, num); return Max; } int main(){ int T, Case = 1; ll ans; scanf("%d", &T); while(T--){ ans = -INF; scanf("%s", a + 1); int len = strlen(a + 1); bool two = check(len); if(two){ ans = big(len - 3) - num1; ans = max(big(len - 4) - num2, ans); } else{ ans = big(len - 3) - num1; } printf("Case #%d: %lld\n", Case++, ans); } return 0; }