算法训练 C*++ Calculations
时间限制:2.0s 内存限制:64.0MB
问题描述
C*++语言和C++语言非常相似,然而C*++的程序有时会出现意想不到的结果。比如像这样的算术表达式:
表达式=基本式 / 表达式+基本式 / 表达式-基本式
基本式=增量 / 系数*增量
增量=a++ / ++a
系数=0/1/2/……/1000
如“5*a++-3*++a+a++”是合法的C*++表达式。
计算这样的表达式的值的方法:首先是每个基本式进行计算,然后按照正常的算术运算法则计算。如果一个基本式包含“a++”,则先进行乘法运算再使变量a权值+1;如果一个基本式包含“++a”,则先使变量a权值+1再进行乘法运算。
然而基本式可以按任意顺序计算,这就是为什么计算结果是完全无法预料的。
你的任务就是去找到最大的可能结果。
第一行,一个整数n,表示变量a的初始值。
第二行,一个合法的C*++表达式。
共一行,一个整数ans,表示最大可能结果。
表达式=基本式 / 表达式+基本式 / 表达式-基本式
基本式=增量 / 系数*增量
增量=a++ / ++a
系数=0/1/2/……/1000
如“5*a++-3*++a+a++”是合法的C*++表达式。
计算这样的表达式的值的方法:首先是每个基本式进行计算,然后按照正常的算术运算法则计算。如果一个基本式包含“a++”,则先进行乘法运算再使变量a权值+1;如果一个基本式包含“++a”,则先使变量a权值+1再进行乘法运算。
然而基本式可以按任意顺序计算,这就是为什么计算结果是完全无法预料的。
你的任务就是去找到最大的可能结果。
第一行,一个整数n,表示变量a的初始值。
第二行,一个合法的C*++表达式。
共一行,一个整数ans,表示最大可能结果。
输入格式
input 1:
1
5*a++-3*++a+a++
input 2:
3
a+++++a
1
5*a++-3*++a+a++
input 2:
3
a+++++a
输出格式
output 1:
11
output 2:
8
11
output 2:
8
数据规模和约定
对于20%的数据,表达式长度<=20。
另有20%的数据,满足n>=0。
对于100%的数据,-1000<=n<=1000,表达式长度<=10000。
注意表达式开头可能有负号!
另有20%的数据,满足n>=0。
对于100%的数据,-1000<=n<=1000,表达式长度<=10000。
注意表达式开头可能有负号!
1 #include <stdio.h> 2 #include <string.h> 3 #define MAXSIZE 10011 4 /*大致思想为将每个++a或者a++的系数提取出来进行排序,之后按照 5 a从初始值开始递增的形式进行相加,需要注意的是++a的情况,需要提前额外加一次*/ 6 int n, ans, k, coe, len, outcome, c[MAXSIZE]; 7 char e[MAXSIZE], s[MAXSIZE]; 8 9 void sort(int x) 10 { 11 int i, j, t; 12 13 for(i = 1; i < x; i ++){ 14 for(j = i+1; j > 1; j--){ 15 16 if(c[j] < c[j-1]){ 17 t = c[j-1]; 18 c[j-1] = c[j]; 19 c[j] = t; 20 }else{ 21 break; 22 } 23 } 24 } 25 } 26 27 int calculate() 28 { 29 int i, j; 30 31 k = outcome = 0; 32 strcpy(s, e); 33 len = strlen(s); 34 35 if(s[0] != ‘-‘){ 36 37 for(i = len + 1; i > 0; i --){ 38 s[i] = s[i-1]; 39 } 40 41 s[0] = ‘+‘; 42 len ++; 43 } 44 45 for(i = 0; i < len; i += 3){ 46 47 if(s[i] == ‘+‘){ 48 coe = 1; 49 }else{ 50 coe = -1; 51 } 52 53 i ++; 54 j = 0; 55 while(‘0‘ <= s[i] && s[i] <= ‘9‘){ 56 j *= 10; 57 j += s[i++] - ‘0‘; 58 } 59 60 if(s[i] == ‘*‘){ 61 i ++; 62 }else{ 63 j = 1; 64 } 65 66 coe *= j; 67 c[++k] = coe; 68 outcome += (n-(s[i] == ‘a‘)) * coe; 69 } 70 71 sort(k); 72 for(i = 1; i <= k; i ++){ 73 outcome += i * c[i]; 74 } 75 76 return outcome; 77 } 78 79 int main() 80 { 81 scanf("%d %s", &n, e); 82 83 ans = calculate(); 84 85 printf("%d\n", ans); 86 87 return 0; 88 }