2016ccpc杭州赛 hdu 5938 F.Four Operations

来源:互联网 发布:扣字刷屏软件手机版 编辑:程序博客网 时间:2024/05/19 13:58


Four Operations

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 79    Accepted Submission(s): 38


Problem Description
Little Ruins is a studious boy, recently he learned the four operations!

Now he want to use four operations to generate a number, he takes a string which only contains digits '1' - '9', and split it into 5 intervals and add the four operations'+''-''*' and '/' in order, then calculate the result(/ used as integer division).

Now please help him to get the largest result.
 

Input
First line contains an integer T, which indicates the number of test cases.

Every test contains one line with a string only contains digits '1'-'9'.

Limits
1T105
5length of string20
 

Output
For every test case, you should output 'Case #x: y', where x indicates the case number and counts from 1 and y is the result.
 

Sample Input
112345
 

Sample Output
Case #1: 1
 

Source
2016年中国大学生程序设计竞赛(杭州)
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:  5943 5942 5941 5940 5939 
 

Statistic | Submit | Discuss | Note
题意:给你一个字符串,把它分成四块,按顺序把符号+ - * /放上去,问能得到的最大数是多少。

思路:又是一道水题。首先我们看*和/,因为前面有-,所以后面的数要尽可能的小。那么相乘要最小肯定是一位数乘一位数。除的话有两种情况,可能除一位数最小可能除两位数最小,因为一位数乘一位数不可能得到三位数,如果除一个三位数会浪费了一位,然后就是加的部分了,加得到的数最大肯定是一位数加多位数或者多位数加一位数,那么现在答案很明显就只有4种情况,4种求出来取最大就是答案了,下面给代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<utility>#include<map>#define maxn 25typedef long long LL;using namespace std;const int mod=1e9+7;;char s[maxn];int a[maxn];LL getnum(int l,int r){    LL ans=0;    for(int i=l;i<=r;i++){        ans=(ans*10)+a[i];    }    return ans;}int main(){    int t;    scanf("%d",&t);    for(int tcase=1;tcase<=t;tcase++){        scanf("%s",s);        int len=strlen(s);        for(int i=0;i<len;i++){            a[i]=s[i]-'0';        }        LL ans=a[0]+getnum(1,len-4)-a[len-3]*a[len-2]/a[len-1];        ans=max(ans,getnum(0,len-5)+a[len-4]-a[len-3]*a[len-2]/a[len-1]);        if(len>5){            int div=getnum(len-2,len-1);            ans=max(ans,a[0]+getnum(1,len-5)-a[len-4]*a[len-3]/div);            ans=max(ans,getnum(0,len-6)+a[len-5]-a[len-4]*a[len-3]/div);        }        printf("Case #%d: %lld\n",tcase,ans);    }}


0 0
原创粉丝点击