2019组队赛第四场(2018湖南省第14届大学生计算机程序设计竞赛)解题报告 Apare_xzc

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]);
            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值