- 伍衍 的博客
DAY12
- @ 2024-7-22 17:31:42
考试错误:无。
思路:
全组合问题,直接暴搜就行了。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int flag[70],cnt,n,r;
void dfs(int u){
if(cnt==r){
cout << " ";
for(int i=1;i<=n;i++){
if(flag[i]) cout << i << " ";
}
cout << endl;
return;
}
if(u>n){
return;
}
flag[u]=1;
cnt++;
dfs(u+1);
cnt--;
flag[u]=0;
dfs(u+1);
}
signed main(){
freopen("xsz.in","r",stdin);
freopen("xsz.out","w",stdout);
cin >> n >> r;
dfs(1);
}
考试错误:在考试时以为只能往后接,没有考虑到往前接的情况,导致扣了分。
思路:
同样是暴搜,枚举所有情况即可。
代码:
#include <bits/stdc++.h>
using namespace std;
char s[80][2];
int vis[80];
int n,ans=-1;
void dfs(int u,int lg){
ans=max(ans,lg);
for(int i=1;i<=n;i++){
if(i==u||s[u]==s[i]) continue;
if(s[u][1]==s[i][0]&&!vis[i]){
vis[i]=1;
dfs(i,lg+1);
vis[i]=0;
}
}
}
int main(){
freopen("JL.in","r",stdin);
freopen("JL.out","w",stdout);
cin >> n;
for(int i=1;i<=n;i++){
cin >> s[i][0] >> s[i][1];
}
vis[1]=1;
dfs(1,1);
cout << ans;
}
考试错误,没做这题,无。
思路:
.这里要用到亿点数学知识:如果一个数与互质,那么这个数一定分别与和互质。
.这样我们就可以用数字的乘积来代替组了。
.最后输出不为零的数字的个数。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[15];
int n;
void dfs(){
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(__gcd(a[i],a[j])==1&&a[i]!=0&&a[j]!=0){
a[i]*=a[j];
a[j]=0;
dfs();
}
}
}
}
int main(){
freopen("fz.in","r",stdin);
freopen("fz.out","w",stdout);
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
dfs();
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i]) cnt++;
}
cout << cnt;
}
考试错误:无。
思路:
标准的洪水填充,思路略。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=550;
int a[N][N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int n,m;
void dfs(int x,int y){
a[x][y]=0;
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(a[nx][ny]==0) continue;
a[nx][ny]=0;
dfs(nx,ny);
}
return;
}
signed main(){
freopen("cd.in","r",stdin);
freopen("cd.out","w",stdout);
cin >> n >> m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
cin >> c;
if(c=='0') a[i][j]=1;
}
}for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((i==1||i==n||j==1||j==m)&&a[i][j]==1){
dfs(i,j);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans+=a[i][j];
}
}
cout << ans;
}
考试错误:没做出来。
思路:
和第一题没有区别,顶多注意元辅音就可以了。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int flag[111],cnt,c,l;
char s[111];
void dfs(int u,int now,int y,int f){
if(u>l){
if(y>=1&&f>=2){
cnt++;
if(cnt>25000) exit(0);
for(int i=1;i<=c;i++){
if(flag[s[i]]) cout << s[i];
}
cout << endl;
}
return;
}
for(int i=now+1;i<=c;i++){
if(!flag[s[i]]){
flag[s[i]]=1;
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u'){
y++;
dfs(u+1,i,y,f);
y--;
}else{
f++;
dfs(u+1,i,y,f);
f--;
}
flag[s[i]]=0;
}
}
}
signed main(){
freopen("ss.in","r",stdin);
freopen("ss.out","w",stdout);
cin >> l >> c;
for(int i=1;i<=c;i++){
cin >> s[i];
}
sort(s+1,s+c+1);
dfs(1,0,0,0);
}