8:30~11:00
做一套四级英语试卷,记单词。
12:00~14:30
辅导妹妹英语和数学
15:00~17:00
测试。
测试我作对了三个题目。
第一题:
P7938
题意翻译
定义一个字符串为括号串当且仅当其仅由 (
和 )
组成。
试将一个长度为 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.
解题思路:统计出有多少对括号,然后用来和m比较大小。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int T,n,m;
int main()
{
scanf("%d",&T);
while(T--)
{
char c;
int x1=0,x2=0,sum=0;
scanf("%d%d",&n,&m);
getchar();
for(int i=0; i<n; i++)
{
c=getchar();
if(c=='(') x1++;//左括号的数量
else
{
x2++;//右括号的数量
if(x1)//有无左括号与之匹配
{
x1--;
x2--;
sum++;
}
}
}
if(sum<m) printf("0\n");
else printf("1\n");
}
}
第二题:CF922A
题意翻译
题目描述
Imp非常喜欢他的毛绒玩具。
最近,他发现了一个可以克隆毛绒玩具的机器。Imp知道如果他将一个玩具本体进行克隆,他将会得到两个本体(新增一个)和一个克隆体;而如果将一个克隆体进行克隆,他将会得到三个克隆体(新增两个)。
一开始,Imp只有一个毛绒玩具本体。他想要知道他能否使用这个机器得到恰好xx 个克隆体和yy 个本体。他不能把玩具扔掉,也不能在没有克隆体的时候对一个克隆体进行克隆。 输入格式
一行两个整数x,y(0 \le x,y \le 10^9)x,y(0≤x,y≤109) ,分别表示Imp想要得到的玩具克隆体数量和本体数量(包括一开始的一个本体)。 输出格式
如果能够满足题意,输出"Yes",否则输出"No"。大小写不敏感。 说明
在样例一中,Imp可以对本体进行两次克隆,再对克隆体进行两次克隆。 翻译贡献者:浮尘ii
输入输出样例
输入 #1复制
6 3
输出 #1复制
Yes
输入 #2复制
4 2
输出 #2复制
No
输入 #3复制
1000 1001
输出 #3复制
Yes
说明/提示
In the first example, Imp has to apply the machine twice to original toys and then twice to copies.
解题思路:通过思考过后,除去本来的一个本体,每多一个本体必多一个克隆体,克隆体的数量减去被本体克隆出来的数量后能被2整除就是可以满足题意的。
AD代码:
#include<bits/stdc++.h>
using namespace std;
int x,y;
int main()
{
scanf("%d%d",&x,&y);
if(y==0||y==1&&x>0) printf("No");
else
{
y=y-1;
x=x-y;
if(x%2==0&&x>=0) printf("Yes");
else printf("No");
}
}
第三题:
P7939
[B1] Alice Wins! (easy version)
题意翻译
AB 每队 2n2n 人正在玩石头剪刀布。A 队第 ii 个人出 a_iai,B 队第 ii 个人出 b_ibi。编号相同的人会对战。若 A 队赢则加一分,平不得分,输扣一分。你可以至多改变每队 nn 个人的出拳方案,使得 A 队的得分最高。输出得分的最大值和任意一组构造方案。
本题中,我们用 11 代表石头,22 代表剪刀,33 代表布。
输入输出样例
输入 #1复制
2 1 1 2 1 2 2 2 3 1 3 1 2 2 1
输出 #1复制
2 1 1 2 2 4 3 1 1 3 1 2 2 1
说明/提示
Explanation
For the first test case, we can change a_2a2 to 11 and b_1b1 to 22. Then Team A can get 22 points. It can be proved that this is the maximum score that Team A can get.
For the second test case, we can change a_1a1 to 33 and a_2a2 to 11.
Constraints
1\le T,n \le 10^5;\ 1\le a_i,b_i \le 31≤T,n≤105; 1≤ai,bi≤3. The sum of nn over all test cases \le 10^5≤105.
解题思路:首先需要知道的一件事就是,一共2*n次出拳,2个公司中每个最多换n个人的出拳方案,那么我肯定是可以全赢的(因为我可以将方案变成我赢或者他输,都算我赢)。其中1赢2,2赢3,3赢1。只需要将每一种情况的变法都写出来即可。每个公司改变n次以内就直接用一个变量来控制两个公司每个公司轮流变的方式控制。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int a[1000100],b[1000100];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
n*=2;//2n次出拳
for(int i=0; i<n; i++)
scanf("%d",a+i);
for(int i=0; i<n; i++)
scanf("%d",b+i);
bool x=0;//两个公司的人轮流变
for(int i=0; i<n; i++)
{
if(a[i]==1&&b[i]==3)
{
if(x==1) a[i]=2;
else b[i]=2;
x=!x;
continue;
}
if(a[i]==2&&b[i]==1)
{
if(x==1) a[i]=3;
else b[i]=3;
x=!x;
continue;
}
if(a[i]==3&&b[i]==2)
{
if(x==1) a[i]=1;
else b[i]=1;
x=!x;
continue;
}
if(a[i]==b[i])
{
if(x==1)
{
a[i]-=1;
if(a[i]==0) a[i]=3;
x=0;
}
else
{
b[i]+=1;
if(b[i]==4) b[i]=1;
x=1;
}
continue;
}
}
printf("%d\n",n);
for(int i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
for(int i=0; i<n; i++)
printf("%d ",b[i]);
printf("\n");
}
}