2019CCPC哈尔滨

正式比赛之前,自信心被打爆掉的一场。。。
真是菜到不忍直视

F. Fixing Banners

题目大意:
每次给你六个字符串,每个字符串都只能选一个字符,问最后是否能组成"harbin"

Solution:
1、每个字符串都只保留有效字符(‘h’,‘a’,‘r’,‘b’,‘i’,‘n’);
如何保留?
我们将每个字符对应一个数字下标
‘h’=1,‘a’=2,‘r’=3,‘b’=4,‘i’=5,‘n’=6
m p [ i ] [ 1 ] mp[i][1] mp[i][1]表示第i个字符串中是否存在字符’h’
m p [ i ] [ 2 ] mp[i][2] mp[i][2]表示第i个字符串中是否存在字符’a’
以此类推。
2、dfs所有可能的选择结果
一共六个字符串,每个字符串都有一些有效字符(最多六个),所以最多就是在 6 × 6 6\times 6 6×6的矩阵中,每行选一个字符,最终组成"harbin"。

与简单dfs全排列的区别:
简单的全排列,对于n个位置,每个位置上只能放一个数字,
列出每一个位置放上不同数字的所有排列即可。
但这里每一个位置上只能放一个字符,而这个字符来源于一个字符串,这个字符串有不止一个字符,因此要想在每个位置上放上不同的字符,首先得先在字符串中选择一个字符。在字符串中选出字符,然后将选出来的这个字符放到位置上。

我们的目标结果是"harbin",每个有效字符的目标位置是明确的,所以我们在字符串中选字符放到某个位置上时,就直接选这个位置上最终应该放的字符。(如果此时这个字符串里没有这个字符,那当然就是No),只有当遍历完所有字符串,能选出所有目标字符放到目标位置上,那就是Yes。
在这里插入图片描述

#include<bits/stdc++.h>
#define pb push_back
#define mpi make_pair
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define pi acos(-1)
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll mod=998244353;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
typedef unsigned long long ull;
inline ll lowbit(ll x){return x&(-x);} 
bool vis[10];
int mp[10][10];//开太大会T
int flag;
void dfs(int num){
	if(num>6){
		flag=1;
		return;
	}
	for(int i=1;i<=6;i++){//遍历所有字符串
		if(!vis[i]&&mp[i][num]){//该字符串还没有被选择过,且字符串中含有目标字符,则选择该字符串
			vis[i]=1;//标记
			dfs(num+1);//匹配字符数加一
			vis[i]=0;//需要回溯,便于下次选择
		}
	}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		string s;
		memset(mp,0,sizeof(mp));
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=6;i++){
			cin>>s;
			for(int j=0;j<s.size();j++){
				if(s[j]=='h') mp[i][1]=1;
				if(s[j]=='a') mp[i][2]=1;
				if(s[j]=='r') mp[i][3]=1;
				if(s[j]=='b') mp[i][4]=1;
				if(s[j]=='i') mp[i][5]=1;
				if(s[j]=='n') mp[i][6]=1;
			}
		}
		flag=0;
		dfs(1);
		if(flag) puts("Yes");
		else puts("No");
	}
	return 0;
} 

J. Justifying the Conjecture

题目大意:
给出一个数字,判断其是否能分解成一个质数加合数的和。若能输出质数和合数,否则输出-1。

思路:
偶数=偶数+偶数
奇数=奇数+偶数
偶数除了2都是合数
所以如果n为偶数,则输出2和n-2
如果n为奇数,则输出3和n-3
如果n小于5,则输出-1。

#include<bits/stdc++.h>
#define pb push_back
#define mpi make_pair
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define pi acos(-1)
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll mod=998244353;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
typedef unsigned long long ull;
inline ll lowbit(ll x){return x&(-x);} 
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		if(n<=5) cout<<"-1"<<endl;
		else if(n&1) cout<<"3 "<<n-3<<endl;
		else cout<<"2 "<<n-2<<endl;
	}
	return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值