アルゴリズムトレーニングC*++Calculations


問題の説明
C*++言語はC++言語とよく似ていますが、C*++のプログラムでは予想外の結果が出ることがあります.たとえば、次のような算術式があります.
式=基本/式+基本/式-基本
基本=増分/係数*増分
増分=a++/++a
係数=0/1/2/……/1000
「5*a++-3*++a+a+++」のように、合法的なC*++式です.
このような式の値を計算する方法は、まず基本式ごとに計算し、通常の算術演算アルゴリズムに従って計算します.1つの基本式が「a++」を含む場合、乗算を行ってから変数aの重み値+1を行う.基本式が「++a」を含む場合、変数aの重み値+1を乗算します.
しかし、基本式は任意の順序で計算することができ、計算結果が全く予想できない理由である.
あなたの任務は最大の可能性のある結果を見つけることです.
最初の行は、変数aの初期値を表す整数nである.
2行目、合法的なC*++式.
合計1行、整数ansで、最大可能な結果を表します.
入力フォーマット
  input 1:
  1
  5*a++-3*++a+a++
  input 2:
  3
  a+++++a
出力フォーマット
  output 1:
  11
  output 2:
  8
データ規模と約定
20%のデータの場合、式の長さは<=20です.
さらに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
", ans); return 0; }