正式比赛之前,自信心被打爆掉的一场。。。
真是菜到不忍直视
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;
}