CodeForces-552E. Vanya and Brackets

本是古典 何须时尚 2022-08-01 13:54 282阅读 0赞
  1. /*CF e题 给定一个表达式,只添加一对括号,使得这个表达式的值最大
  2. * 由于乘号比较少,枚举括号的位置就行;
  3. * 左括号的位置一定在乘号的右边,右括号的位置一定在乘号的左边,
  4. * 这样才能使得表达式的值最大,否则移动括号一定能找到比较大的值
  5. */
  6. #include<map>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<iostream>
  10. #include<cstring>
  11. #include<string>
  12. #include<algorithm>
  13. #include<cmath>
  14. #include<stack>
  15. #include<queue>
  16. #include<set>
  17. #define inf 0x3f3f3f3f
  18. #define mem(a,x) memset(a,x,sizeof(a))
  19. using namespace std;
  20. typedef long long ll;
  21. typedef pair<int,int> pii;
  22. inline int in()
  23. {
  24. int res=0;char c;
  25. while((c=getchar())<'0' || c>'9');
  26. while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
  27. return res;
  28. }
  29. stack<ll> num;
  30. stack<ll> num2;
  31. stack<char> ch;
  32. ll calc(string & s)
  33. {
  34. while(num.size())num.pop();
  35. while(num2.size())num2.pop();
  36. while(ch.size())ch.pop();
  37. int n=s.size();
  38. bool have=0;
  39. int k1,k2;
  40. for(int i=0;i<n;i++)
  41. {
  42. if(s[i]=='(')
  43. {
  44. have=1;
  45. k1=i;
  46. ++i;
  47. while(s[i]!=')')
  48. {
  49. if(s[i]=='*')
  50. {
  51. ch.push(s[i]);
  52. }
  53. else if(s[i]>='0' && s[i]<='9')
  54. {
  55. if(ch.size() && ch.top()=='*')
  56. {
  57. ll t1 = s[i]-'0';
  58. ll t2 = num.top();
  59. num.pop();
  60. ch.pop();
  61. num.push(t1*t2);
  62. }
  63. else num.push(s[i]-'0');
  64. }
  65. ++i;
  66. }
  67. k2=i;
  68. break;
  69. }
  70. }
  71. ll tmp=0;
  72. while(num.size())
  73. {
  74. tmp+=num.top();
  75. num.pop();
  76. }
  77. string t=".";
  78. if(have)s.replace(k1,k2-k1+1,t);
  79. //cout<<s<<endl;
  80. n=s.size();
  81. for(int i=0;i<n;i++)
  82. {
  83. if(s[i]=='*')ch.push(s[i]);
  84. else if((s[i]>='0' && s[i]<='9') || s[i]=='.')
  85. {
  86. if(ch.size() && ch.top()=='*')
  87. {
  88. ll t1;
  89. if(s[i]!='.')t1 = s[i]-'0';
  90. else t1 = tmp;
  91. ll t2 = num.top();
  92. num.pop();
  93. ch.pop();
  94. num.push(t1*t2);
  95. }
  96. else num.push(s[i]=='.'? tmp:s[i]-'0');
  97. }
  98. }
  99. ll res=0;
  100. while(num.size())
  101. {
  102. res+=num.top();
  103. //cout<<num.top()<<endl;
  104. num.pop();
  105. }
  106. //cout<<"res=="<<res<<endl;
  107. return res;
  108. }
  109. vector<int> vec;
  110. int main()
  111. {
  112. string s,t;
  113. cin>>s;
  114. t=s;
  115. vec.clear();
  116. int n=s.size();
  117. vec.push_back(-1);
  118. for(int i=1;i<n;i+=2)
  119. {
  120. if(s[i]=='*')
  121. {
  122. vec.push_back(i);
  123. }
  124. }
  125. vec.push_back(n);
  126. n=vec.size();
  127. ll ans=calc(s);
  128. for(int i=0;i<n-1;i++)
  129. {
  130. for(int j=i+1;j<n;j++)
  131. {
  132. s=t;
  133. s.insert(vec[i]+1,1,'(');
  134. s.insert(vec[j]+1,1,')');
  135. //cout<<s<<endl;
  136. ans=max(ans,calc(s));
  137. }
  138. }
  139. cout<<ans<<endl;
  140. return 0;
  141. }

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读