题目描述
给定一个长度为 nn 的序列,Alice 和 Bob 交替操作一共 kk 次,第 ii 次当前操作的人必须选一个 -x_i \sim x_i−xi∼xi 的整数把它插在序列开头或结尾,Alice 先手(也就是说 ii 为奇数时由 Alice 来插入一个 -x_i\sim x_i−xi∼xi 的整数,ii 为偶数时由 Bob 来插入一个 -x_i\sim x_i−xi∼xi 的整数)。
记最终的序列为 a_1,a_2,\dots,a_{n+k}a1,a2,…,an+k,则得分为 \sum_{i=1}^{n+k} (-1)^{i-1}a_i∑i=1n+k(−1)i−1ai。Alice 希望得分最大,Bob 希望得分最小。在两人都采取最优策略的情况下,求最终得分。
输入格式
第一行两个正整数 n,kn,k 表示初始序列长度以及操作次数。
接下来一行 nn 个整数 a_1,a_2,\dots,a_na1,a2,…,an,表示初始的序列。
接下来一行 kk 个非负整数,第 ii 个表示 x_ixi。
输出格式
一行一个整数表示答案。
输入输出样例
输入 #1复制
2 2 1 3 2 2
输出 #1复制
-2
解题思路:无论前面怎么改变,对于最后一个操作的人来说都有逆风翻盘的机会,可以把前面的数的和变为正数或负数,所以对于最后一个人他只需要每次操作使得和s绝对值最大,而另一个人则需使和s最小。
#include<iostream>
using namespace std;
long long int a[1000000],b[1000000];//注意long long int,数据范围不能太小
int main()
{
long long int n,m,s=0;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>a[i];
if(i%2==0)
s+=-a[i];
else
s+=a[i];
}//求出a,b未进行操作时的s的值
for(int i=1; i<=m; i++)
cin>>b[i];
if(m%2==0)//如果最后一次操作由b来完成
{
for(int i=1; i<=m; i++)
{
if(i%2==0)//b要使得s的绝对值尽可能的大
{
if(s>=0)
s+=abs(b[i]);
else
s-=abs(b[i]);
}
else//a要使s的绝对值尽可能小,趋近于0
{
if(s>=0)
{
if(abs(b[i])>=s)
s=0;
else
s-=abs(b[i]);
}
else
{
if(abs(b[i])>=abs(s))
s=0;
else
s+=abs(b[i]);
}
}
}
s=-abs(s);//对于b来说,在最后一步的时候会使前面的值变为负数并加上一个最小的负数
}
else//同理
{
for(int i=1; i<=m; i++)
{
if(i%2!=0)
{
if(s>=0)
s+=abs(b[i]);
else
s-=abs(b[i]);
}
else
{
if(s>=0)
{
if(abs(b[i])>=s)
s=0;
else
s-=abs(b[i]);
}
else
{
if(abs(b[i])>=abs(s))
s=0;
else
s+=abs(b[i]);
}
}
}
s=abs(s);
}
// for(int i=1;i<=n+m;i++)
//cout<<a[i]<<' ';
//cout<<endl;
cout<<s;
}
定义一个字符串为括号串当且仅当其仅由 (
和 )
组成。
试将一个长度为 nn 的括号串分为 2m2m 个子序列,子序列可以为空,且每个字符都必须分到恰好一个子序列中,使得至少 mm 个子序列为匹配的括号串。空序列不算匹配的括号序列。无解请输出 00,否则输出 11。本题多组数据,其中数据组数为 TT。
定义 AA 为 BB 的子序列当且仅当 AA 能由 BB 在顺序不改变的前提下删除若干元素后得到。
*样例 11 解释:你可以将第一个和第二个字符分入第一个子序列,让第二个子序列为空子序列。此时第一个子序列为 ()
,第二个为空,总计有一个匹配的括号序列,满足要求。
输入输出样例
输入 #1复制
2 2 1 () 2 99 ()
输出 #1复制
1 0
说明/提示
Explanation
For the first test case, we can construct p_1=\{1,2\}p1={1,2} and p_2=\{\}p2={}. So p_1p1 is a "beautiful array".
For the second test case, it is obvious that we cannot use two numbers to construct 9999 beautiful arrays.
Constraints
1\le T,n,m\le 2001≤T,n,m≤200.
解题思路:开始时我理解成了构成的所有的括号只能是单个的,即()()(),结果错了,后来发现可以这样组成((()))即算3个,所以只需判断有几个完整(),如果多余m个,则说明是"beautiful array".否则不是
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
for(int j=0; j<t; j++)
{
int n,m;
cin>>n>>m;
int k=0,l=0,s=0;
char a[1000];
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=0; i<n; i++)
{
if(a[i]=='(')
k++;
else if(a[i]==')'&&k>=l+1){
k--;
s++;}
}
if(s>=m)
cout<<"1"<<endl;
else
cout<<"0"<<endl;
}
}