A题
题目大意:打印“atcoder"中从第l个到第r个字母
参考代码:
#include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int l,r; string s="atcoder"; signed main() { IOS; cin>>l>>r; for(int i=l-1;i<=r-1;i++) cout<<s[i]; return 0; }
B题:
题目大意:
给定一张这种图,求第r,c个是白色还是黑色
解法:白色表示0,黑色表示1,将数组打表(可能15x15有点多但是好在上下是对称分布的,打完中间和上面的复制就可以了),然后输出a[r][c]是0还是1就可了
参考代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 5 int r,c; 6 int a[20][20]={ 7 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//1 8 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//2 9 {1,0,1,1,1,1,1,1,1,1,1,1,1,0,1},//3 10 {1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},//4 11 {1,0,1,0,1,1,1,1,1,1,1,0,1,0,1},//5 12 {1,0,1,0,1,0,0,0,0,0,1,0,1,0,1},//6 13 {1,0,1,0,1,0,1,1,1,0,1,0,1,0,1},//7 14 {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},//8 15 {1,0,1,0,1,0,1,1,1,0,1,0,1,0,1},//9 16 {1,0,1,0,1,0,0,0,0,0,1,0,1,0,1},//10 17 {1,0,1,0,1,1,1,1,1,1,1,0,1,0,1},//11 18 {1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},//12 19 {1,0,1,1,1,1,1,1,1,1,1,1,1,0,1},//13 20 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//14 21 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//15 22 23 }; 24 signed main() 25 { 26 IOS; 27 cin>>r>>c; 28 r=r-1; 29 c=c-1; 30 if(a[r][c]==1) 31 cout<<"black"<<endl; 32 else 33 cout<<"white"<<endl; 34 return 0; 35 }
官方给的题解好像更为简单:
只要判定距离中心块的距离是奇数还是偶数就可以了
#include <iostream> using namespace std; int main(void) { int r, c; cin >> r >> c; if(max(abs(r-8), abs(c-8)) % 2) cout << "black" << endl; else cout << "white" << endl; return 0; }
C题:
题目大意:
给定两个矩阵A,B,需要在执行一系列操作后使得矩阵A 和矩阵B相等
你可以执行的操作是删除某一行或者是某一列
就比如:
4 5
矩阵A :
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
2 3
矩阵B:
6 8 9
16 18 19
可以删除矩阵A的1,2行,删除矩阵A 的2,5列就可以使得矩阵A 和矩阵B相等
解法:
要匹配与矩阵A和b相等,对行枚举有2^h1中方案,对列枚举有2^w1种方案,
对此,我们以二进制状态来表示这个行或者是列是否被选中不删或者是删除:
我们以底部开始如果当前位是0表示删除当前行,当前位是1表示不删除当前行
比如:
我们要从4行里删除1,3行,就可以表示0101
而这种方案以二进制来讲有0000....000,000...00001.....00000...111,1111111,
以十进制来表示就是0,1,2,.....2^h1-1种方案
同样,列也是如此
所以说,我们就可以写两个for来分别扫描行与列,判断选中的行列的元素是否与匹配的矩阵的行列元素相等
参考代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 5 const int N=20; 6 int h1,w1; 7 int h2,w2; 8 int a[N][N]; 9 int b[N][N]; 10 signed main() 11 { 12 IOS; 13 /*cin>>x>>n; 14 ansl=x&(1<<n-1); 15 cout<<ansl;*/ 16 cin>>h1>>w1; 17 for(int i=1;i<=h1;i++) 18 { 19 for(int j=1;j<=w1;j++) 20 cin>>a[i][j]; 21 } 22 cin>>h2>>w2; 23 for(int i=1;i<=h2;i++) 24 { 25 for(int j=1;j<=w2;j++) 26 cin>>b[i][j]; 27 } 28 for(int i=0;i<(1<<h1);i++)//对行枚举 29 { 30 for(int j=0;j<(1<<w1);j++)//对列枚举 31 { 32 vector<int>h,w; 33 for(int k=1;k<=h1;k++) 34 if((i&(1<<(k-1)))==0)//判断后k位置是不是0,也就是说不被删除 35 h.push_back(k);//放入不被删除的行列中 36 for(int k=1;k<=w1;k++) 37 if((j&(1<<(k-1)))==0) 38 w.push_back(k); 39 if(h.size()!=h2||w.size()!=w2)//判断不被删除的行列的个数和匹配矩阵的行列是否相等 40 continue; 41 bool flag=true; 42 for(int n=1;n<=h2;n++) 43 { 44 for(int m=1;m<=w2;m++) 45 { 46 if(a[h[n-1]][w[m-1]]!=b[n][m])//进行匹配 47 { 48 flag=false; 49 break; 50 } 51 } 52 } 53 if(flag) 54 { 55 cout<<"Yes"<<endl; 56 return 0; 57 } 58 } 59 } 60 cout<<"No"<<endl;//如果从头到位都没有匹配的,就说明不能满足匹配矩阵 61 return 0; 62 }
D题:
题目大意,给定一个字符串,可以对相邻两个字符位置互换,要求将这个字符串转化成"atcoder"的最小步数
解法:
可以对每个位置的字母进行枚举,从a到r分别查找在给定字符串中的位置,然后从此位置开始往前一直交换,同时统计步数
然后从t在查找到给定字符串的位置交换到第2位,因为第一位已经交换成了a,同时统计步数,
一直到e,
r是可以不被统计的,因为前6位都确定了,所以说r的位置也就确定了
参考代码:
1 //atcoder 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define int long long 5 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 6 string s; 7 int cnt; 8 signed main() 9 { 10 IOS; 11 getline(cin,s); 12 int pos=s.find('a'); 13 for(int i=pos;i>0;i--) 14 { 15 swap(s[i-1],s[i]); 16 cnt++; 17 } 18 pos=s.find('t'); 19 for(int i=pos;i>1;i--) 20 { 21 swap(s[i],s[i-1]); 22 cnt++; 23 } 24 pos=s.find('c'); 25 for(int i=pos;i>2;i--) 26 { 27 swap(s[i],s[i-1]); 28 cnt++; 29 } 30 pos=s.find('o'); 31 for(int i=pos;i>3;i--) 32 { 33 swap(s[i],s[i-1]); 34 cnt++; 35 } 36 pos=s.find('d'); 37 for(int i=pos;i>4;i--) 38 { 39 swap(s[i],s[i-1]); 40 cnt++; 41 } 42 pos=s.find('e'); 43 for(int i=pos;i>5;i--) 44 { 45 swap(s[i],s[i-1]); 46 cnt++; 47 } 48 cout<<cnt<<endl; 49 return 0; 50 }
不过貌似官方给定题解更好一些:
将当前字符串视为一个顶点,用bfs来统计多少次操作可以使得当前字符串和atcoder相等
offical code:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int main(){ 6 string s; 7 cin >> s; 8 9 map<string,int> mp; 10 queue<string> q; 11 12 mp[s]=0; 13 q.push(s); 14 15 while(!q.empty()){ 16 string current=q.front();q.pop(); 17 if(current=="atcoder"){ 18 cout << mp[current] << "\n"; 19 return 0; 20 } 21 22 for(int i=1;i<7;i++){ 23 string next=current; 24 swap(next[i-1],next[i]); 25 if(mp.find(next)==mp.end()){ 26 q.push(next); 27 mp[next]=mp[current]+1; 28 } 29 } 30 } 31 return 0; 32 }
标签:AtCoder,cout,Beginner,int,题解,矩阵,cin,pos,IOS From: https://www.cnblogs.com/LQS-blog/p/16586521.html