2019组队赛第四场 解题报告
(2018湖南省第14届大学生计算机程序设计竞赛) 解题报告
by lj zx xzc
2019/4/2
前言:
xzc:
这次周赛大的不是很爽,我觉得有一部分原因是我们的状态不好,思维没有很活跃吧。 可能大家都没睡午觉吧。
这场比赛我们队出了3到题,一道签到,一道模拟?一道猜想,剩下的时间都在卡K题和B题。(B题zyw骗我们说他可以进化成dp手,我们一直在推传统的加减乘除的dp…)当时大家都没有往完全平方数的找规律的方向去想。
K题是因为没有memset所以wa,后来我也wa了几发,应该是前缀和的边界没处理好
J题是我的锅,当时lj跟我说它就是一颗树,可以做,但是我当时在卡B题,没有去开这道题,(当时我觉得zyf+zyw做了半天才做出来,我们短时间不一定能AC…),其实dfs还挺好写的
还有我们队一般是过了样例就交,有时候1A的非常爽,但是wa起来会罚时爆炸的
我觉得这些都是小问题,平时暴露出来也好,多注意,及时改掉就好啦,总比现场赛出锅要强。
我们队还是很厉害的!大家加油呀!
只要大家平时好好刷题,比赛头脑清醒,也可以像twt他们队一样nb的! 冲鸭!
vjudge链接: CCNUACM Team Contest 2019 Round #4
A.字符画
签到题
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
#define LL long long
#define MP make_pair
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
char a[5][20] = {
"oooooooooooo","..oo.o.o.o.o",
"oooo.o.o.ooo","o..o.o.o.o.o","oooooooooooo" };
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int w;
cin>>w;
for(int i=0;i<5;++i)
{
printf("%c%c%c",a[i][0],a[i][1],a[i][2]);
int cnt = 3;
for(int t=1;t<=3;t++)
{
for(int u=0;u<w;++u)
printf(".");
for(int p=0;p<3;p++)
printf("%c",a[i][cnt++]);
}
printf("\n");
}
return 0;
}
B.2018
题面:
Bobo 想统计满足下面条件的矩阵 A 的数量。
矩阵 A 有 n 行 m 列,每个元素都是正整数。第 i 行第 j 列的元素用 Aij 表示。
A1, 1 = 2018.
对于所有 2 ≤ i ≤ n, 1 ≤ j ≤ m,Ai, j 是 Ai − 1, j 的约数。
对于所有 1 ≤ i ≤ n, 2 ≤ j ≤ m,Ai, j 是 Ai, j − 1 的约数。
因为满足条件的矩阵 A 数量很多,Bobo 只想统计满足条件的矩阵数量除以 (109 + 7) 的余数。
1 ≤ n, m ≤ 2000
数据组数不超过 105.
Input
输入文件包含多组数据,请处理到文件结束。
每组数据包含 2 个整数 n 和 m.
Output
对于每组数据输出 1 个整数表示所求的数量除以 (1E9+7) 的余数。
Sample Input
1 1
1 2
2 2
2 3
2000 2000
Sample Output
1
4
25
81
570806941
Hint
对于第二组样例(n=1, m=2),满足条件的矩阵 A 有 (2018,2018),(2018,1009),(2018,2),(2018,1) 共 4 种。
解法:
- 观察得都是完全平方数,然后猜想规律
- ans[i][j] = dp[i][j]^2
- dp[i][j] = dp[i-1][j] + dp[i][j-1]+1
无语了。。。
代码:
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define LL long long
using namespace std;
const int maxn = 2005;
const int mod = 1e9+7;
LL dp[maxn][maxn];
int main()
{
For(i,1,2000) dp[1][i] = dp[i][1] = i;
For(i,2,2000)
For(j,2,2000)
dp[i][j] = (dp[i-1][j]+dp[i][j-1]+1)%mod;
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
LL ans = dp[x][y]*dp[x][y]%mod;
printf("%lld\n",ans);
}
return 0;
}
C.时间旅行
题面都懒得挂了,这题也是猜想题
zyf巨巨证明出来了
他过了,我们其它两个队也跟着都过了…
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
LL c,h;
while(scanf("%lld%lld",&h,&c)!=EOF)
{
LL ans = 0;
if(c<h) ans = h;
else ans = c+1;
printf("%lld\n",ans);
}
return 0;
}
D.卖萌表情
题面:
已知以下 4 种都是卖萌表情(空白的部分可以是任意字符。竖线是便于展示的分隔符,没有实际意义):
^ ^ | ^ | < | >
v | v v | > | <
| | < | >
给出 n 行 m 列的字符矩阵,Bobo 希望找出互不重叠的卖萌表情数量的最大值。互不重叠的意思是每个字符只属于至多一个卖萌表情。
1 ≤ n, m ≤ 1000
矩阵只包含 ^, v, <, > 4 种字符。
n × m 的和不超过 2 × 106.
Input
输入文件包含多组数据,请处理到文件结束。
每组数据的第一行包含 2 个整数 n 和 m.
接下来 n 行的第 i 行包含长度为 m 的字符串,表示字符矩阵的第 i 行。
Output
对于每组数据输出 1 个整数表示互不重叠的卖萌表情数量的最大值。
Sample Input
2 4
^^^^
>vv<
2 4
vvvv
>^^<
4 2
v>
<>
<>
^>
3 4
^>^>
v
>>>>
Sample Output
2
0
2
2
Hint
第一组样例中有 2 个第一种卖萌表情。
第四组样例中有 3 个卖萌表情,但是互不重叠的卖萌表情最多只有 2 个。
分析:
对每个矩阵的符号遍历,比对表情,比对成功,标记,计算得出结果
代码:
#include<cstdio>
char str[1005][1005];
int sign[1005][1005];
int main()
{
int n,m,count;
while(scanf("%d%d",&n,&m)!=EOF){
count = 0;
for(int i =0;i < n;i++){
scanf("%s",str[i]);