题意:给出a的初始值和一串关于a的表达式,表达式由a++和++a以及数字系数组成。a++和++a的计算顺序任意求表达式的最大值。
思路:将字符串当中的系数和a++,++a处理出来,按系数升序排序,贪心累加。
C++代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,f;
friend bool operator<( const node&a , const node&b )
{
return a.x<b.x;
}
}data[5010];
int n; char s[10010];
int main()
{
while ( scanf ( "%d%s" , &n , s )==2 )
{
int cnt = 0,len = strlen(s);
for ( int i=0,tmp=0,flag=0,num=0 ; i<len-2 ; i++ )
{
if ( s[i]=='a'&&s[i+1]=='+'&&s[i+2]=='+' )
{
if ( num==0 ) tmp = 1;
if ( flag ) tmp = -tmp;
data[cnt].x = tmp;
data[cnt].f = 0;
i=i+2;
cnt++;
tmp = 0,num = 0,flag = 0;
}
else if ( s[i]=='+'&&s[i+1]=='+'&&s[i+2]=='a' )
{
if ( num==0 ) tmp = 1;
if ( flag ) tmp = -tmp;
data[cnt].x = tmp;
data[cnt].f = 1;
i=i+2;
cnt++;
tmp = 0,num = 0,flag = 0;
}
else if ( s[i]>='0'&&s[i]<='9' )
{
tmp = tmp*10+s[i]-'0'; num = 1;
}
else if ( s[i]=='-' )
{
flag = 1;
}
}
sort ( data , data+cnt );
int ans = 0;
for ( int i=0 ; i<cnt ; i++ )
{
ans = ans+data[i].x*(n+data[i].f); n++;
}
printf ( "%d\n" , ans );
}
return 0;
}