CF彩笔题解1647 A to C
A
分析
通过模拟一些例子我们可以发现其实就是对%3做讨论:
如果n % 3 == 0, 则输出(n / 3)个 “21” (比“12”更大)
如果n % 3 == 1, 则输出(n / 3)个 “12” (拆解出的位数更多) + 末尾的一个"1"
如果n % 3 == 2, 则输出(n / 3)个 “21” (比“12”更大) + 末尾的一个"2"
AC代码
#include<iostream> using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; if(n<3) { cout<<n<<endl; continue; } int q=n/3,w=n%3; if(w==0) for(int i=0;i<q;i++) cout<<"21"; else if(w==1) { cout<<'1'; for(int i=0;i<q;i++) cout<<"21"; } else { for(int i=0;i<q;i++) cout<<"21"; cout<<'2'; } puts(""); } return 0;}
B
分析
只要存在01
11
就是NO
AC代码
#include<iostream> using namespace std; int a[110][110]; int main() { int T; cin>>T; while(T--) { int n,m; cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%1d",&a[i][j]); int t=1; for(int i=0;i<n-1;i++) { if(t==0) break; for(int j=0;j<m-1;j++) { if(a[i][j]==0&&a[i][j+1]==1&&a[i+1][j]==1&&a[i+1][j+1]==1) { t=0; break;} else if(a[i][j]==1&&a[i][j+1]==0&&a[i+1][j]==1&&a[i+1][j+1]==1) { t=0; break;} else if(a[i][j]==1&&a[i][j+1]==1&&a[i+1][j]==0&&a[i+1][j+1]==1) { t=0; break;} else if(a[i][j]==1&&a[i][j+1]==1&&a[i+1][j]==1&&a[i+1][j+1]==0) { t=0; break;} } } if(t) puts("YES"); else puts("NO"); } return 0; }
C
分析
可以发现,矩阵左上角的位置(1,1)是无法被染成黑色(1方格)的,如果目标矩阵的左上角为黑色则无解。从最后一层最后一个开始涂起,如果当前位置应要黑色,就把位置涂黑,然后把上面的位置涂白,一直这样到第一层再从右边往左涂,涂到第一个就无法动了,所以只要第一个不是1,那么就有方案
AC代码
#include<iostream> #include<vector> using namespace std; const int N=110; char x[N][N]; int n,m; int main() { int T; cin>>T; while(T--) { cin>>n>>m; vector<pair<int ,int>> ans; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cin>>x[i][j]; } int f=0; for(int i=n;i>=1;i--) { for(int j=m;j>=1;j--) { if(x[i][j]=='1') { if(i-1>=1) { ans.push_back({i-1,j}); ans.push_back({i,j}); } else if(j-1>=1) { ans.push_back({i,j-1}); ans.push_back({i,j}); } else f=1; } } } if(f==1) cout<<-1<<endl; else { cout<<ans.size()/2<<endl; for(int i=0;i<ans.size();i+=2) cout<<ans[i].first<<" "<<ans[i].second<<" "<<ans[i+1].first<<" "<<ans[i+1].second<<endl; } } return 0; }

浙公网安备 33010602011771号