2019CCPC哈尔滨站题解(F、I、J、K)

这篇博客详细解析了2019年CCPC哈尔滨站的四道算法题:F - Fixing Banners、I - Interesting Permutation、J - Justifying the Conjecture 和 K - Keeping Rabbits。每道题目都包含题意、样例、解题思路及代码实现。博主通过全排列和DFS等方法解决这些问题,并分享了遇到的超时问题和解决方案。
摘要由CSDN通过智能技术生成

F - Fixing Banners

题意:

T组测试样例,每组样例输入6个字符串(都是小写),现在需要在每个字符串中取且只取一个字母,请问能否在该操作下得到"harbin"(顺序任意,得到这六个字母即可)。

样例:

Input

2

welcome
toparticipate
inthe
ccpccontest
inharbin
inoctober

harvest
belong
ninja
reset
amazing
intriguing

Output

No

Yes

思路:

很容易想到先定义一个二维数组check[6][6],check[i][j]代表第i个串中出现了第j个字母(h=0,a=1,r=2,b=3,i=4,n=5)

得到这个记录了字母的数组之后问题来了。怎样在每个串中只取一个字母得到harbin呢?

有两种方法,我最先想到的就是dfs搜索,用一个辅助数组记录每个字母是否被取过。正当我准备敲dfs时,我看到了I题的题目——

                        I——Interesting Permutation

我默念了两遍permutation,这不是排列吗,我的脑海闪过全排列函数next_permutation(),正好可以把所有可能性遍历一遍,只有6!应该不会超时,然后我就敲的next_permutaiton()。

后面想了一下,dfs似乎更快一点,但是全排列也过了。还是数据要是更大比如heilongjiang啥的还是建议用dfs

代码如下

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;

typedef long long ll;


int main(void)
{
   int t;
   string s[6];
   cin>>t;
   int check[6][6];
   int a[6];
   while(t--)
   {
       memset(check,0,sizeof(check));
       memset(a,0,sizeof(a));
       for(int i=0;i<6;i++)
       {
           cin>>s[i];
           for(int j=0;j<s[i].size();j++
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值