1月24日学习总结

题目描述

给定一个长度为 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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值