第一题:
#include<bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n>>m; for(int i=1;i<(1<<n);i++){ int cnt=0; int x=i; bool flag=false; while(x>m){ if(x==2*m+1)flag=true; x>>=1;cnt++; } if(x==m&&i!=m){ if(flag)cout<<i-(1<<cnt-1)<<endl; else cout<<i+(1<<cnt-1)<<endl; } else cout<<i<<endl; } }
第二题:
#include<bits/stdc++.h> using namespace std; int n,k; int g[1005]; int main(){ cin>>n>>k; for(int i=1;i<=n;i++)cin>>g[i]; int ans=0; while(1){ sort(g+1,g+1+n); int cnt=0; for(int i=n;i>=1;i--){ if(g[i])g[i]--,cnt++; if(cnt==k)break; } ans+=cnt==k; if(cnt!=k)break; } cout<<ans<<endl; }
第三题:
#include<bits/stdc++.h> using namespace std; int n; int dp[1005][1005]; int main(){ cin>>n; auto dfs=[&](auto&& dfs,int word,int cache,bool flag)->int{ if(word>=n)return 0; if(dp[word][cache])return dp[word][cache]; int ans=n; ans=min(ans,dfs(dfs,word+1,cache,0)+1); if(cache)ans=min(ans,dfs(dfs,word+cache,cache,0)+2); if(word&&!flag)ans=min(ans,dfs(dfs,word,word,1)+5); return dp[word][cache]=ans; }; cout<<dfs(dfs,0,0,0)<<endl; }
第四题:
#include<bits/stdc++.h> using namespace std; int m,n; int a[35][35]; int b[35][35]; int c[35]; char s[1000],q[1000]; bool del(){ bool flag=false; for(int j=1;j<=n;j++) for(int i=1;i<=m-2;i++) if(a[i][j]&&a[i][j]==a[i+1][j]&&a[i+1][j]==a[i+2][j]){ b[i][j]=b[i+1][j]=b[i+2][j]=0; flag=true; } for(int i=1;i<=m;i++) for(int j=1;j<=n-2;j++) if(a[i][j]&&a[i][j]==a[i][j+1]&&a[i][j+1]==a[i][j+2]){ b[i][j]=b[i][j+1]=b[i][j+2]=0; flag=true; } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ if(b[i][j]==0)a[i][j]=0; b[i][j]=1; } return flag; } void fall(){ for(int j=1;j<=n;j++){ int index=0; for(int i=m;i>=1;i--) if(a[i][j])c[++index]=a[i][j]; for(int i=1;i<=index;i++)a[m-i+1][j]=c[i]; for(int i=index+1;i<=m;i++)a[m-i+1][j]=0; } } void insertq(){ int index=0,len=strlen(q+1); for(int i=m;i>=1;i--) for(int j=1;j<=n;j++) if(!a[i][j]&&index<len) a[i][j]=q[++index]-'0'; } int main(){ cin>>m>>n; scanf("%s%s",s+1,q+1); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) a[i][j]=s[n*(i-1)+j]-'0',b[i][j]=1; while(true){ bool flag=true; while(del()){ flag=false; fall(); } if(flag)break; insertq(); } for(int i=1;i<=n;i++)printf("%d",a[1][i]);puts(""); }
全部评论
(4) 回帖