HDU 5938 Four Operations 贪心(中国大学生程序设计竞赛(杭州))
Posted Coolxxx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5938 Four Operations 贪心(中国大学生程序设计竞赛(杭州))相关的知识,希望对你有一定的参考价值。
Four Operations
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 22 Accepted Submission(s): 12Problem DescriptionLittle 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.
InputFirst 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
1≤T≤105
5≤length of string≤20
OutputFor 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 Input1 12345
Sample OutputCase #1: 1
Source
Recommend
Statistic | Submit | Discuss | Note
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5938
题目大意:
给一串长度为5~20的数字串(只含1~9),要求按顺序将 + - * / 各1个分别插入数字之间,使得最终运算结果最大。
题目思路:
【贪心】
分析*,因为前面是-号所以希望乘的数小,所以乘和- /之间只隔1位。
分析/,除只可能除1位数或2位数(因为乘只乘1位,3位不优,2位可能是111991,原先我以为只要/一位)。
分析+,可以知道位数越大加的结果越大,所以+只能是1位数与多位数相加。
所以综上可以分类讨论,/1位或2位,乘紧挨/前,-紧挨*,之前的数字要么在第一个断开,要么最后一个。
答案取最大即可。
1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<map> 9 #include<stack> 10 #include<queue> 11 #include<set> 12 #include<bitset> 13 #include<memory.h> 14 #include<time.h> 15 #include<stdio.h> 16 #include<stdlib.h> 17 #include<string.h> 18 //#include<stdbool.h> 19 #include<math.h> 20 #pragma comment(linker,"/STACK:1024000000,1024000000") 21 #define min(a,b) ((a)<(b)?(a):(b)) 22 #define max(a,b) ((a)>(b)?(a):(b)) 23 #define abs(a) ((a)>0?(a):(-(a))) 24 #define lowbit(a) (a&(-a)) 25 #define sqr(a) ((a)*(a)) 26 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 27 #define mem(a,b) memset(a,b,sizeof(a)) 28 #define eps (1e-8) 29 #define J 10000 30 #define mod 1000000007 31 #define MAX 0x7f7f7f7f 32 #define PI 3.14159265358979323 33 #define N 24 34 using namespace std; 35 typedef long long LL; 36 typedef unsigned long long ULL; 37 double anss; 38 LL aans; 39 int cas,cass; 40 int n,m,lll,ans; 41 LL sum,tot,s1,s2; 42 char s[N]; 43 int main() 44 { 45 #ifndef ONLINE_JUDGEW 46 // freopen("1.txt","r",stdin); 47 // freopen("2.txt","w",stdout); 48 #endif 49 int i,j,k; 50 int x,y,z; 51 // init(); 52 // for(scanf("%d",&cass);cass;cass--) 53 for(scanf("%d",&cas),cass=1;cass<=cas;cass++) 54 // while(~scanf("%s",s)) 55 // while(~scanf("%d%d",&n,&m)) 56 { 57 tot=0;sum=0;s1=0;s2=0; 58 printf("Case #%d: ",cass); 59 scanf("%s",s); 60 n=strlen(s); 61 tot=-(s[n-3]-‘0‘)*(s[n-2]-‘0‘)/(s[n-1]-‘0‘); 62 s1=s[0]-‘0‘;s2=0; 63 for(i=1;i<n-3;i++) 64 s2=s2*10+s[i]-‘0‘; 65 sum=tot+s1+s2; 66 s1=s[n-4]-‘0‘;s2=0; 67 for(i=0;i<n-4;i++) 68 s2=s2*10+s[i]-‘0‘; 69 tot+=s1+s2; 70 sum=max(sum,tot); 71 if(n>5) 72 { 73 tot=-(s[n-4]-‘0‘)*(s[n-3]-‘0‘)/((s[n-2]-‘0‘)*10+s[n-1]-‘0‘); 74 s1=s[0]-‘0‘;s2=0; 75 for(i=1;i<n-4;i++) 76 s2=s2*10+s[i]-‘0‘; 77 tot+=s1+s2; 78 sum=max(sum,tot); 79 tot=-(s[n-4]-‘0‘)*(s[n-3]-‘0‘)/((s[n-2]-‘0‘)*10+s[n-1]-‘0‘); 80 s1=s[n-5]-‘0‘;s2=0; 81 for(i=0;i<n-5;i++) 82 s2=s2*10+s[i]-‘0‘; 83 tot+=s1+s2; 84 sum=max(sum,tot); 85 } 86 printf("%lld\n",sum); 87 } 88 return 0; 89 } 90 /* 91 // 92 93 // 94 */
以上是关于HDU 5938 Four Operations 贪心(中国大学生程序设计竞赛(杭州))的主要内容,如果未能解决你的问题,请参考以下文章
HDU 5938 Four Operations 贪心(中国大学生程序设计竞赛(杭州))
HDU 5938 Four Operations 字符串处理,枚举,把数字字符串变为数值
[HDOJ5938]Four Operations(暴力,DFS)
Four-operations: 使用node.js实现四则运算程序