HDU5938.Four Operations

来源:互联网 发布:电脑版地图软件 编辑:程序博客网 时间:2024/05/22 00:35


题目大意:输入一个数字串(不包括0)s,将"+","-","*","/",依次插入数字串中,求经过运算后能得到的最大结果。

题解:若想得到最大结果,则"-"前面那部分尽可能大,后面那部分尽可能小,要使相加最大,则必定为一位数加多位数或多位数加一位数,要使相乘结果尽可能小,则只能是一位数乘以一位数,结果最大为两位数(9*9=81),故最后除数可以为一位数或二位数,所以总共四种情况,比较即可。


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char str[25];long long a[25],ans;long long add(int m,int n)//得到多位数{    long long sum = 0;    int i;    for(i=m; i<=n; i++)        sum = (sum*10) + a[i];    return sum;}int main(){    int T,i;    scanf("%d",&T);    int k = T;    while(T--)    {        scanf("%s",str);        int len = strlen(str);        for(i=0; i<len; i++)            a[i] = str[i]-'0';//将字符型转化为数字            ans = a[0]+add(1,len-4)-a[len-3]*a[len-2]/a[len-1];//一位数加多位数            ans = max(ans,add(0,len-5)+a[len-4]-a[len-3]*a[len-2]/a[len-1]);//一位数加多位数与多位数加一位数比较        if(len>5)        {          int m = add(len-2,len-1);          ans = max(ans,a[0]+add(1,len-5)-a[len-4]*a[len-3]/m);//除以一位数与除以二位数比较          ans = max(ans,add(0,len-6)+a[len-5]-a[len-4]*a[len-3]/m);        }        printf("Case #%d: %lld\n",k-T,ans);    }    return 0;}


原创粉丝点击