D
给出一个长度为 n 的序列 a,月色哥哥会从序列的第一个元素 a 1按顺序看到序列的最后一个元素 a n。对于序列的第
i 个元素 a i,月色哥哥可以进行下面的操作之一:
令 x=x⋅a i ;
令 x=x+a i。
请求出 x 的最大值,并输出这个最大值除 998244353 的余数。
首先判断sum是否为0(f1)
如果是0,那么只能进行加运算
如果不为0,再判断sum是否大于1(f2),ai是否大于1,如果都不,就只能进行加运算,如果都,就进行乘运算
const int mod = 998244353;
void solved()
{
int n; cin >> n;
int a[n + 1];
int sum = 0;
bool f1 = 0, f2 = 0;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
if(f1)//如果现在的sum大于0
{
if(a[i] == 0 || a[i] == 1 || !f2)//f2表示现在sum是1
{
sum += a[i];
if(!f2 && sum > 1)
f2 = 1;
sum %= mod;
}
else
{
sum = (sum % mod) * (a[i] % mod) % mod;
}
}
else //sum == 0
{
sum += a[i];
if(sum != 0)
f1 = 1;
if(sum > 1)
f2 = 1;
sum %= mod;
}
}
cout << sum % mod << endl;
}
E
题意:
给一堆括号,每次可以交换任意两个相同的括号,问最少操作多少次,让他合法,合法就是有序,可以插入1或者
+,eg:(())(),(()(())),()…
从头开始遍历,a是(, b是),当b>a时,证明需要交换,b比a多几个,证明他需要交换多少次,
如果a!=b,那么无论怎么交换,都不合法
void solved()
{
int n; string s;
cin >> n >> s;
int a = 0, b = 0;
long long sum = 0;
for(int i = 0; i < n; i ++)
{
if(s[i] == '(')
{
if(b > a)
sum += b - a;
a ++;
}
else
b ++;
}
if(a == b) cout << sum << endl;
else cout << "-1" << endl;
}