本文主要是介绍蓝桥杯 算法训练 C*++ Calculations,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
表达式=基本式 / 表达式+基本式 / 表达式-基本式
基本式=增量 / 系数*增量
增量=a++ / ++a
系数=0/1/2/……/1000
如“5*a++-3*++a+a++”是合法的C*++表达式。
计算这样的表达式的值的方法:首先是每个基本式进行计算,然后按照正常的算术运算法则计算。如果一个基本式包含“a++”,则先进行乘法运算再使变量a权值+1;如果一个基本式包含“++a”,则先使变量a权值+1再进行乘法运算。
然而基本式可以按任意顺序计算,这就是为什么计算结果是完全无法预料的。
你的任务就是去找到最大的可能结果。
第一行,一个整数n,表示变量a的初始值。
第二行,一个合法的C*++表达式。
共一行,一个整数ans,表示最大可能结果。
1
5*a++-3*++a+a++
input 2:
3
a+++++a
11
output 2:
8
另有20%的数据,满足n>=0。
对于100%的数据,-1000<=n<=1000,表达式长度<=10000。
注意表达式开头可能有负号!
#include <stdio.h>
#include <string.h>
#define MAXSIZE 10011
int n, ans, k, coe, len, outcome, c[MAXSIZE];
char e[MAXSIZE], s[MAXSIZE];
void sort(int x)
{
int i, j, t;
for(i = 1; i < x; i ++){
for(j = i+1; j > 1; j--){
if(c[j] < c[j-1]){
t = c[j-1];
c[j-1] = c[j];
c[j] = t;
}else{
break;
}
}
}
}
int calculate()
{
int i, j;
k = outcome = 0;
strcpy(s, e);
len = strlen(s);
if(s[0] != '-'){
for(i = len + 1; i > 0; i --){
s[i] = s[i-1];
}
s[0] = '+';
len ++;
}
for(i = 0; i < len; i += 3){
if(s[i] == '+'){
coe = 1;
}else{
coe = -1;
}
i ++;
j = 0;
while('0' <= s[i] && s[i] <= '9'){
j *= 10;
j += s[i++] - '0';
}
if(s[i] == '*'){
i ++;
}else{
j = 1;
}
coe *= j;
c[++k] = coe;
outcome += (n-(s[i] == 'a')) * coe;
}
sort(k);
for(i = 1; i <= k; i ++){
outcome += i * c[i];
}
return outcome;
}
int main()
{
scanf("%d %s", &n, e);
ans = calculate();
printf("%d\n", ans);
return 0;
}
这篇关于蓝桥杯 算法训练 C*++ Calculations的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!