アルゴリズムトレーニング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.
式の先頭に負の記号がある可能性があります.
問題解には参考ネットがある
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;
}