2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情
Posted jkzr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情相关的知识,希望对你有一定的参考价值。
Description
已知以下 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>v
>>>>
Sample Output
2 0 2 2
思路:贪心,由图我们可以看出这个表情分为两种类型,那么对于前两种哪个表情优先级更高一些呢,你可以看图,虽然这个图有点迷,但是仔细看一下应该还是能懂的(尴尬脸),
对于第二类的表情其实没啥区别,优先级一样。那么知道这些就很简单了。直接看代码吧。
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <list>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1.0);
const int MOD=1e9+7;
const int maxn=1005;
int n,m,cnt;
char s[maxn][maxn];
bool vis[maxn][maxn];
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
// for(int i=1;i<=n;i++)
// printf("%s
",s[i]+1);
cnt=0;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]==‘v‘)
{
if(j-2>0)
{
if((s[i][j-2]==‘v‘&&vis[i][j-2]==false&&s[i-1][j-1]==‘^‘&&vis[i-1][j-1]==false))
{
cnt++;
vis[i][j]=true;vis[i][j-2]=true;vis[i-1][j-1]=true;
}
}
if(s[i-1][j-1]==‘^‘&&s[i-1][j+1]==‘^‘&&vis[i-1][j-1]==false&&vis[i-1][j+1]==false)
{
cnt++;
vis[i][j]=true;vis[i-1][j-1]=true;vis[i-1][j+1]=true;
}
}
}
}
// printf("%d
",cnt);
if(n<3)
printf("%d
",cnt);
else
{
for(int i=3;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]==‘<‘)
{
if(s[i-1][j+1]==‘>‘&&vis[i-1][j+1]==false&&s[i-2][j]==‘<‘&&vis[i-2][j]==false)
{
cnt++;
vis[i][j]=true;vis[i-1][j+1]=true;vis[i-2][j]=true;
}
}
if(s[i][j]==‘>‘)
{
if(s[i-1][j-1]==‘<‘&&vis[i-1][j-1]==false&&s[i-2][j]==‘>‘&&vis[i-2][j]==false)
{
cnt++;
vis[i][j]=true;vis[i-1][j-1]=true;vis[i-2][j]=true;
}
}
}
}
printf("%d
",cnt);
}
}
return 0;
}
/**********************************************************************
Problem: 1361
User: HNCPCteam001
Language: C++
Result: AC
Time:528 ms
Memory:3996 kb
**********************************************************************/
以上是关于2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情的主要内容,如果未能解决你的问题,请参考以下文章
2018湖南省第14届大学生计算机程序设计竞赛 C: 时间旅行
最短路STLCSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)
湖南省第九届大学生计算机程序设计竞赛 Interesting Calculator