zoukankan      html  css  js  c++  java
  • ACM程序设计选修课——1041: XX's easy problem(神烦的多次字符串重定向处理)

    1041: XX's easy problem

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 41  Solved: 7
    [Submit][Status][Web Board]

    Description

    XX is a good student who likes to ask questions.But sometimes when you get the problem, you are not willing to answer his question bucause the problem is too easy.For example,He'll ask how much a + b is equal to, or how much a + b is equal to,etc.
    Today he just got a new problem,so he asks you for help:He has an expression of form x1 op x2 op x3.....xn,and op is just '+' or '*',xi(1 <= i <= n) a digits between 1 and 9。However, this problem is not so easy, you need to add one pair of brackets in this expression so that to maximize the value of the resulting expression.

     

    Input

    The first line contains expression,x1 op x2 op x3.....xn(1 <= n <= 50),op is '+' or '*'.The answer maxmized dosen't exceed 2^63-1.

     

    Output

    In the first line print the maximum possible value of an expression.

     

    Sample Input

    1+2*3
    2*2*2

    Sample Output

    9
    8

    哎西每次可以AC的时候先给我的CE真是醉了,HUST这个OJ真是有毒,字符串长度的unsigned和普通int都要分那么清楚。这题怎么说呢,做了我一个晚上+半个晚上(估计是我思路不太好,只能向麻烦的做法靠近)...试了各种方法,最后特判+巨烦的多次string重定向终于过了。恭喜下自己终于上60题,可以够到大神远远跑在前面留下的灰尘了....做法嘛没什么好说的,毫无算法,枚举所有括号的位置,然后按照括号和加法乘法优先级进行模拟运算再取max。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    typedef long long LL;
    string s;
    inline LL fx(string s)//识别优先级的计算函数
    {
    	LL i,cheng,tans;
    	for (i=0; i<(LL)s.size(); i++)
    	{
    		if(s[i]=='+')
    			s[i]=' ';
    	}
    	istringstream sin(s);
    	string temp;
    	LL t,sum=0;
    	while (sin>>temp)
    	{		
    		for (i=0; i<(LL)temp.size(); i++)
    		{
    			if(temp[i]=='*')
    				temp[i]=' ';
    		}
    		istringstream ssin(temp);
    		tans=1;
    		while (ssin>>cheng)
    		{
    			tans=tans*cheng;
    		}
    		sum=sum+tans;	
    	}
    	return sum;
    }
    inline string change(string s)//去括号并将括号内的数据进行计算并代回去
    {
    	LL ans,len=(LL)s.size(),i,j,l=-1,r=-1;
    	string temp;
    	for (i=0; i<len; i++)
    	{
    		if(s[i]=='(')
    		{
    			l=i;
    			for (j=len-1; j>=i; j--)
    			{
    				if(s[j]==')')
    				{
    					r=j;
    					break;
    				}
    			}
    			break;
    		}		
    	}
    	ans=fx(s.substr(l+1,r-l-1));
    	stringstream in;
    	in<<ans;
    	in>>temp;
    	s.replace(l,r-l+1,temp);
    	return s;
    }
    int main (void)
    {
    	ios::sync_with_stdio(false);
    	LL i,j;
    	LL maxx,t;
    	string t1,t2,t3,t4;
    	while (getline(cin,s))
    	{
    		if(s.size()==1)
    		{
    			cout<<s<<endl;
    			continue;
    		}
    		LL len=s.size();
    		maxx=-9999999;		
    		for (i=0; i+2<len; i+=2)//枚举所有括号位置(括号内至少两个数)
    		{			
    			for (j=i+2; j<len; j+=2)
    			{
    				t3=s;
    				t1=s.substr(i,j-i+1);
    				t2=t3.erase(i,j-i+1);
    				t2.insert(i,'('+t1+')');
    				t4=change(t2);
    				t=fx(t4);
    				if(t>maxx)
    				{
    					maxx=t;
    				}					
    			}										
    		}
    		cout<<maxx<<endl;				
    	}
    	return 0;
    }
  • 相关阅读:
    如何使得VIM显示行号
    mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication的解决方法
    重启PHP命令
    一个方便的shell命令,查看软件安装目录
    Centos中安装vim
    centos yum安装mysql
    nginx安装php和php-fpm
    大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图
    vim命令
    linux 下MySQL的安装
  • 原文地址:https://www.cnblogs.com/Blackops/p/5356390.html
Copyright © 2011-2022 走看看